sizeof(空结构)和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; } 

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

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

 sizeof(EmptyStruct) = 1 sizeof(StructEmptyArr) = 0 

我可以理解为什么sizeof(EmptyStruct)等于1但不明白为什么sizeof(StructEmptyArr)等于0 。 为什么两者之间有差异?

在C中,如果没有任何指定的成员定义一个结构,程序的行为是不确定的。

C11-§6.7.2.1:

如果struct-declaration-list不包含任何指定的成员,直接或通过匿名结构或匿名联合,行为是未定义的。

GCC允许一个空的结构作为扩展 ,其大小将为0


对于C ++, 标准不允许大小为0的对象,因此sizof(EmptyStruct)返回值为1。
标准C ++¹不支持标准C ++¹支持的长度为零的数组,但GNU作为扩展支持数组,如果应用sizeof运算符将返回0


1.§8.5.1-footnote 107)C ++没有零长度的数组。

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

G ++将空结构视为它们具有chartypes的单个成员。

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

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