带指针的sizeof运算符

时间:2017-11-07 07:13:00

标签: c pointers

#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。

有人可以告诉我哪里出错吗?

3 个答案:

答案 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)

首先,我在你的计划中做了一些修正。

  1. 我使用int main代替void main
  2. 使用%zu格式说明符而不是%d,因为sizeof返回size_t
  3. 代码:

    #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