我有两个结构定义如下:
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
。为什么两者之间存在差异?
答案 0 :(得分:40)
在C中,如果定义了没有任何命名成员的结构,则程序的行为是不确定的。
C11-§6.7.2.1:
如果struct-declaration-list不包含任何命名成员(直接或通过匿名结构或匿名联合),则行为未定义。
GCC允许空结构为an extension,其大小为0
。
对于C ++,the standard doesn't allow an object of size 0
因此sizof(EmptyStruct)
返回值为1
标准C ++¹不支持零长度数组,但supported as an extension by GNU和sizeof
运算符如果应用则返回0
。
1.§8.5.1-脚注107)C ++没有零长度数组。
答案 1 :(得分:5)
https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html
G ++将空结构视为具有char类型的单个成员。
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
GNU C中允许使用零长度数组。它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头。