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中允许使用零长度的数组。它们作为一个结构的最后一个元素非常有用,它是一个可变长度对象的头部。