C中Sizeof的行为

时间:2011-07-25 08:34:58

标签: c arrays sizeof

我已经了解到,当我们将数组名称传递给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;  
}  

8 个答案:

答案 0 :(得分:5)

此签名

void dimension(int arr[])

绝对等同于

void dimension(int *arr)

另见Question 6.4

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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));
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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