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++没有零长度数组.
小智 5
https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html
G ++将空结构视为具有char类型的单个成员.
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
GNU C中允许使用零长度数组.它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头.