为什么将数组传递给函数会改变其 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中文网其他相关文章!