零大小的结构

pic*_*c11 12 c c++ gcc

我注意到,当使用GCC编译时,4.6 sizeof(Foo)是0并且sizeof(Bar)是1.由于某种原因,将空数组添加到空结构中使其大小为0.我认为两个结构的大小必须相同.这里发生了什么?

struct Foo
{
    char x[];
};

struct Bar {};
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 16

无论是struct声明由C标准允许的.n1570中的6.7.2.1(8):

如果struct-declaration-list不包含任何命名成员(直接或通过匿名结构或匿名联合),则行为未定义.

并在同一部分第18段:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的数组成员.在大多数情况下,忽略灵活的数组成员.特别地,结构的尺寸好像省略了柔性阵列构件,除了它可以具有比遗漏意味着更多的拖尾衬垫.

(强调我的)

C++中不允许使用灵活的数组成员,因此代码也不是有效的C++.

由于它不是有效代码,因此报告的值sizeof无意义.