[英]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.