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是一个指针,它是一个整数。
它返回指针的大小,即整数。
因为您传递的是未知大小的数组。