【发布时间】:2011-07-25 08:34:57
【问题描述】:
我了解到,当我们将数组名传递给 sizeof 时,数组名不会衰减为指向基地址的指针。下面的代码通过给出答案 10 来验证这一事实。
#include <stdio.h>
int main(){
int arr[10];
printf("Size of array is %d" , sizeof(arr)/sizeof(int));
return 0;
}
但是当我运行下面的代码时,答案是1。不管一个维度是否写在原型中,答案都是1。为什么会这样?
#include <stdio.h>
void dimension(int arr[]){
printf("Sizof array is %d" , sizeof(arr)/sizeof(int));
}
int main(){
int arr[10];
dimension(arr);
return 0;
}
【问题讨论】:
-
标准规定函数参数中的数组名将被视为指针。所以
int arr[]将是int *arr,int arr[][10]将是int (*p)[10](指针的剩余大小)。顺便说一句:sizeof(arr)/sizeof(arr[0])更好,当你改变arr的类型时,你就不用修改这个地方了。 -
@Stan:我认为应该是一个答案。
-
它产生 1 是因为您在
sizeof(void *) == sizeof(int); 的 32 位环境中工作。在 64 位环境中,它通常会产生 2,因为指针是 8 个字节,但int仍然是 4 个字节。