首页 >后端开发 >C++ >为什么 C 中函数内部和外部的数组'sizeof()”返回不同的值?

为什么 C 中函数内部和外部的数组'sizeof()”返回不同的值?

Barbara Streisand
Barbara Streisand原创
2024-12-21 18:35:09888浏览

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in C?

为什么将数组传递给函数会改变其 sizeof() 值

在 C 编程中,将数组传递给函数可能会导致使用 sizeof() 检索它时有关其大小的意外行为。这种特性是由于数组衰减的概念而产生的。

数组衰减解释

当数组传递给函数时,它会隐式转换或“衰减”为指向其第一个元素的指针。此转换有效地隐藏了数组的真实大小,因为 sizeof() 现在对指针而不是原始数组进行操作。

代码示例

考虑以下代码片段:

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (incorrect)
}

int main(int argc, const char * argv[]) {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct)

    test(point);

    return 0;
}

在此示例中,对 sizeof() 进行了两次调用。 main() 函数中的第一次调用正确返回数组点的大小为 3。但是,test() 函数中的第二次调用错误地返回 2。出现这种结果不匹配的原因是数组点在以下情况下衰减为指针:它被传递给函数。

克服数组衰减

在传递给 a 时保留数组的真实大小函数中,必须显式向函数传递一个指定大小的附加参数。

void test(int arr[], size_t elems) {
   /* ... */
}

int main(int argc, const char * argv[]) {
   int point[3] = {50, 30, 12};
   /* ... */
   test(point, sizeof(point)/sizeof(point[0]));
   /* ... */
}

通过将大小作为单独的参数传递,函数可以准确确定数组的真实大小并执行相应的操作.

注意:

获取数组的sizeof(point)/sizeof(point[0])技巧size 可能并不总是适用于动态分配的数组。

以上是为什么 C 中函数内部和外部的数组'sizeof()”返回不同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn