C中空结构的大小是多少?

据我说,它是零,但这里似乎有点混乱

我用gcc编译器对它进行了测试,它给出了零作为输出。 我知道在C ++中,空类的大小是1.如果我在这里遗漏任何东西,请告诉我。

结构在C中不能为空,因为语法禁止它。 此外,如果结构没有命名成员,则存在一个语义约束,使行为不确定:

 struct-or-union-specifier: struct-or-union identifieropt { struct-declaration-list } struct-or-union identifier struct-or-union: struct union struct-declaration-list: struct-declaration struct-declaration-list struct-declaration struct-declaration: specifier-qualifier-list struct-declarator-list ; /* type-specifier or qualifier required here! */ specifier-qualifier-list: type-specifier specifier-qualifier-listopt type-qualifier specifier-qualifier-listopt struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator struct-declarator: declarator declaratoropt : constant-expression 

如果你写

 struct identifier { }; 

它将为您提供诊断消息,因为您违反了语法规则。 如果你写

 struct identifier { int : 0; }; 

然后你有一个没有命名成员的非空结构,因此行为未定义,不需要诊断:

如果struct-declaration-list不包含命名成员,则行为未定义。

请注意,不允许以下内容,因为灵活的数组成员不能是第一个成员:

 struct identifier { type ident[]; }; 

C语法不允许struct的内容为空 – 必须至少有一个未命名的位域或命名成员(就语法而言 – 我不确定是否只包含一个结构的结构未命名的位域是有效的)。

支持C中的空结构是GCC的扩展 。

在C ++中,空结构/类成员规范是明确允许的,但是大小定义为1 – 除非作为空基本优化的一部分,允许编译器使空基类在派生类中不占用空间。

在C99中:“如果struct-declaration-list不包含命名成员,则行为未定义。”

尽管我没有看到任何需要诊断的东西,但语法并没有真正允许它,这使得它几乎回到了“未定义的行为”阵营。

在VC 8上,如果我们尝试获取sizeof空结构,则会出错,反之在linux上使用gcc,它给出大小为1,因为它使用gcc扩展而不是c语言规范,这表示这是未定义的行为。

 struct node { // empty struct. }; int main() { printf("%d", sizeof(struct node)); return 0; } 

在Windows vc 2005上它使用gcc在linux上提供了编译错误,它给出了大小为1,因为gcc扩展名为http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures(As Michael Burr指出)