为什么 C 中函数内部的数组大小计算不同
将数组传递给函数时,C 会自动将数组衰减为指针到它的第一个元素。该指针携带第一个数组元素的地址,但不携带其大小。
考虑这个例子:
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
在 main 中,sizeof(point) 正确给出了整个数组的大小 ( 12 字节)。然而,在测试中,sizeof(arr) 产生 4 个字节(整数指针的大小),导致数组大小计算不正确(缺少一个元素)。
要解决此问题,必须显式指定数组大小作为单独的参数传递:
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
请注意,sizeof(point)/sizeof(point[0]) 适用于堆栈分配的数组,但不适用于动态分配的数组,因为它依赖于底层的衰减机制。
以上是为什么'sizeof”在 C 函数内部和外部给出不同的数组大小?的详细内容。更多信息请关注PHP中文网其他相关文章!