相同的表达式,但在函数中使用时返回值不同

时间:2012-03-01 03:01:57

标签: c arrays

我正在编写一个返回int数组大小的函数。逻辑是:sizeof(arr) / sizeof(int);如果我将它保存到变量,它工作正常,但如果我将它返回到函数,我得到1的10字节大小的数组。为什么?这是我的代码:

int b[10];
int t1=  sizeof (b) / sizeof (int);
size_t t2 = lenof(b);
printf("t1 = %d, t2 = %d\n", t1, t2);

size_t lenof (int arr[]) { return sizeof (arr) / sizeof (int); }

以上C代码打印:

t1 = 10, t2 = 1
有人可以帮我解释一下吗?也许我应该使用指针吗?感谢。

1 个答案:

答案 0 :(得分:2)

情景1:

 int t1=  sizeof (b) / sizeof (int); 

在这种情况下,sizeof(b)返回数组的大小,除以int的大小,正确地生成数组元素的数量。

情景2:
将数组传递给函数时,它会衰减为指向array.Hence中的第一个元素的指针,

lenof(int arr[]) 

实际上完全等同于:

lenof(int *arr) 

证明,sizeof (arr)会产生系统上指针的大小&它的大小似乎与系统上int的大小相同,因此除法和函数返回1


C不提供对数组的边界检查,因此如果写入超出数组边界,则永远不会收到警告。这实际上意味着使用数组,你必须自己跟踪数组中存在多少元素。

如果您需要函数内部数组的大小,最简单的解决方案是将数组的大小作为单独的参数传递。

lenof(int arr[], int len);