#include<stdio.h>
void main()
{
int a[2][3][4];
printf("%d",sizeof(*a)); // Output 24.
}
我怀疑是阵列&#39; a&#39;是int(*)[3] [4]类型。现在在取消引用(* a)之后,它将变为int(*)[4]。因此,当指针指向4个整数的数组时,大小应为4 * 2 = 8。但输出为4 * 3 * 2 = 24。
有人可以告诉我哪里出错吗?
答案 0 :(得分:2)
这里有一些关于类型的主要混淆 -
首先,您的陈述 - a
的类型为int (*)[3][4]
,否!
a
声明为类型int[2][3][4]
并保持不变,除非它在传递给函数时被衰减为指针。
现在,当您撰写*a
时,您需要取消引用一次,为您提供类型 - int[3][4]
。由于您说int
的大小为2个字节,因此您获得2 * 3 * 4 = 24
个字节。
正如@FelixPalmen所建议的那样,当数组是sizeof
,_Alignof
的操作数时,数组类型的标识符将始终衰减为指向它的第一个元素除了的指针。 &
。既然你在这里使用了sizeof
,那就不行了。
另一方面,如果a被声明为int (*(*a))[4];
,那么你所说的内容是正确的,而*a
的大小可能是sizeof(pointer)
,这可能取决于你的系统。
答案 1 :(得分:0)
首先,我在你的计划中做了一些修正。
int main
代替void main
%zu
格式说明符而不是%d
,因为sizeof返回size_t
。代码:
#include<stdio.h>
int main()
{
int a[2][3][4];
printf("%zu",sizeof(*a)); // Output 24.
}
现在,此处a
是第2行和第3列的3D int
类型数组,每列有4个元素。
所以,
= sizeof(*a) // dereferencing *a
= (col * elements) * sizeof(int)
= (3 * 4) * 4 // sizeof int depend on plat form
= 12 * 4
= 48
在线Wandbox编译器演示。
答案 2 :(得分:0)
将a
视为
[ [ [ int int int int ] [ int int int int ] [ int int int int ] ] [ [ int int int int ] [ int int int int ] [ int int int int ] ] ]
每次你将a
解除引用进入一组括号内。
a 2 x 3 x 4 ints
*a 3 x 4 ints
**a 4 ints
***a int