sizeof(空结构)和sizeof(结构与空数组)之间的区别?

duo*_*gja 35 c c++ struct sizeof

我有两个结构定义如下:

struct EmptyStruct{

};

struct StructEmptyArr{
    int arr[0];
};

int main(void){
    printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
    printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 14.04,x64上用gcc(g ++)4.8.4编译.

输出(对于gcc和g ++):

sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
Run Code Online (Sandbox Code Playgroud)

我能理解为什么sizeof(EmptyStruct)等于1但不能理解为什么sizeof(StructEmptyArr)等于0.为什么两者之间存在差异?

hac*_*cks 40

在C中,如果定义了没有任何命名成员的结构,则程序的行为是不确定的.

C11-§6.7.2.1:

如果struct-declaration-list不包含任何命名成员(直接或通过匿名结构或匿名联合),则行为未定义.

GCC允许空结构作为扩展,其大小将是0.


对于C++,该标准不允许尺寸的目的0,并因此sizof(EmptyStruct) 返回值1.
零长度的阵列不是由标准C++¹支撑,但支持作为由GNU的延伸和所述sizeof操作者将返回0如果施加.


1.§8.5.1-脚注107)C++没有零长度数组.

  • @michael它没有实际意义,因为虽然苹果是红色的,我的衬衫是蓝色的,在ISO C结构中必须有一个指定的成员,这些都不相关,因为问题不是苹果,ISO C或我的衬衫 (2认同)
  • @ JohannesSchaub-litb; [这不是我的假设](http://www.stroustrup.com/bs_faq2.html#sizeof-empty).另外:*"除非它是位字段(9.6),否则大多数派生对象应具有非零大小并且应占用一个或多个存储字节.**基类子对象可以具有零大小**."*§1.8(第5页) (2认同)

小智 5

https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html

G ++将空结构视为具有char类型的单个成员.

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

GNU C中允许使用零长度数组.它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头.