繁体   English   中英

为什么大小不一样? 数组的 sizeof(a) vs sizeof(&a)?

[英]Why the size differs? sizeof(a) vs sizeof(&a) of an array?

对于下面的代码。

int a[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));

output 是

16
8

'a' 代表整个数组(也是数组的第一个元素的地址,因为它是一维数组),sizeof(a) 代表整个数组的大小。 因此大小是 16。明白了。

'&a' 代表整个数组的地址,而sizeof(&a) 代表什么?

我猜它的 output 是 8 因为该值是一个地址并计算固定指针的大小? 因此 8. 我是对的吗?

但是我还是没搞清楚。 任何人都可以帮忙给出一个明确的解释吗?

因为,它们的类型不同,并且sizeof运算符对类型进行操作。

首先, sizeof运算符产生size_t类型的结果。 您应该使用%zu格式说明符来打印结果。

也就是说,在这种情况下, a是数组(这是一个特定的用例,其中数组不会“衰减”),因此,它将大小计算为元素数量乘以每个元素的大小。 在您的情况下, int的大小应该是4 ,因此您得到4*4 , 16 为了便于理解,以下打印语句类似:

printf("%zu\n",sizeof(a));
printf("%zu\n",sizeof(int[4])); // same as above

另一方面, &a表示数组的地址,该地址是一个指针,类型为int (*)[4] 同样,您的系统似乎使用 8 个字节作为指针大小,因此是 output。 为了比较,我们可以写

printf("%zu\n",sizeof(&a));
printf("%zu\n",sizeof(int(*)[4])); // same as above

表达式&a返回一个指向a的指针。

系统中指针的大小为8字节。

我猜它的 output 是 8 因为该值是一个地址并计算固定指针的大小? 因此 8. 我是对的吗?

是的 -表达式&a产生一个指向a的指针,它的类型为int (*)[4] (指向int的 4 元素数组的指针)。 在您的系统上,该指针类型为 8 个字节宽。

所以,

sizeof a  == sizeof (int [4])    == 16
sizeof &a == sizeof (int (*)[4]) == 8
sizeof *a == sizeof a[0] == sizeof (int) == 4

不同的指针类型可能有不同的大小,但在大多数桌面和服务器系统上,所有 object 指针的大小都相同(4 或 8 字节,具体取决于架构)。

旁注: sizeof运算符,而不是 function - 仅当操作数是类型名称时才需要括号。 sizeof (a)而不是sizeof a并没有什么坏处,我知道这里有些人推荐它,但我个人倾向于不这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM