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

时间:2009-10-26 18:21:01

标签: c compiler-construction

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

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

4 个答案:

答案 0 :(得分:41)

结构在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[]; };

答案 1 :(得分:6)

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

Support for empty structs in C are an extension in GCC

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

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

struct node
{
// empty struct.
};

int main()
{
printf("%d", sizeof(struct node));
return 0;
}
Windows vc 2005上的

它给出了编译错误 在linux上用gcc它给出了1的大小,因为gcc扩展 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures (正如Michael Burr所指出的那样)