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

时间:2017-07-19 15:18:15

标签: 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;
}

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

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

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

我可以理解为什么sizeof(EmptyStruct)等于1,但无法理解为什么sizeof(StructEmptyArr)等于0。为什么两者之间存在差异?

2 个答案:

答案 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 GNUsizeof运算符如果应用则返回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中允许使用零长度数组。它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头。