C中Sizeof的行为

我已经了解到,当我们将数组名称传递给sizeof时,数组的名称不会衰减到指向基址的指针。 下面的代码通过给出答案10来validation这一事实。

#include  int main(){ int arr[10]; printf("Size of array is %d" , sizeof(arr)/sizeof(int)); return 0; } 

然而,当我运行下面的代码时,答案是1.无论维度是否是用原型编写,答案都是1.为什么会这样?

 #include  void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } int main(){ int arr[10]; dimension(arr); return 0; } 

这个签名

 void dimension(int arr[]) 

完全等同于

 void dimension(int *arr) 

另见问题6.4

因为您传递的是未知大小的数组,该数组相当于此上下文中的指针。 sizeof是在编译时计算的,而不是运行时。

当数组传递给函数时,它作为指针而不是数组传递,因此sizeof(arr)将返回sizeof(int *)

但是,作为函数参数的数组衰减到指针。 由于这是在调用sizeof()之前发生的,因此无法阻止它。

试想一下:如果可以传递任何大小的数组并且没有额外的信息可用,那么sizeof()如何知道数组的大小? 在设置中,你得到sizeof(指针),这似乎与int的大小相同。

 void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } 

arr[]衰减到一个指针,因此你有相当于

 printf("Sizof array is %d" , sizeof(int*)/sizeof(int)); 

因为在你的平台上, sizeof(int*) == sizeof(int) ,你得到1作为结果。

但请注意,对于可变长度数组, sizeof成为运行时操作:

 int main () { int i = ...; int x[i]; printf("number of elements: %d", sizeof (x) / size(*x)); } 

因为arr是一个指针,它是一个整数。

它返回指针的大小,即整数。

因为您传递的是未知大小的数组。