零大小结构

Zero size struct

本文关键字:结构      更新时间:2023-10-16

我注意到,当用GCC 4.6编译时,sizeof(Foo)是0,sizeof(Bar)是1。出于某种原因,将空数组添加到空结构中使其大小为 0。我认为两个结构的大小必须相同。这是怎么回事?

struct Foo
{
    char x[];
};
struct Bar {};

C 标准不允许struct声明。 N1570 中的 6.7.2.1 (8):

如果结构声明列表不包含任何命名成员,无论是直接还是通过匿名结构或匿名联合,则行为是未定义的。

以及同一节的第18段:

作为特例,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略灵活数组成员。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。

(强调我的)

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

由于它不是有效的代码,因此sizeof为这些代码报告的值毫无意义。

sizeof 运算符永远不会产生 0,即使对于空类也是如此。

正如您在 MSDN 上看到的

此外,MSDN 指出:

sizeof 运算符不能与以下操作数一起使用:

  • 功能。(但是,sizeof 可以应用于指向函数的指针。
  • 位字段。
  • 未定义的类。
  • 类型空。
  • 动态分配的数组。
  • 外部数组。
  • 不完整的类型。
  • 不完整类型的括号名称。

C 和 C++ 不允许使用零大小的对象。

GCC 确实支持它们作为扩展。 如果使用正确的选项进行编译,例如

gcc -std=c99 -pedantic -Wall -Wextra

GCC 至少会警告你它们;G++ 也有类似的选择。