12

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

struct Foo
{
    char x[];
};

struct Bar {};
4

3 回答 3

16

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

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

以及同一节中的第 18 段:

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

(强调我的)

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

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

于 2012-06-10T19:38:04.953 回答
1

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

正如您在 msdn 上看到的

此外,msdn 声明:

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

  • 职能。(但是,sizeof 可以应用于指向函数的指针。)
  • 位字段。
  • 未定义的类。
  • 类型无效。
  • 动态分配的数组。
  • 外部阵列。
  • 不完整的类型。
  • 不完整类型的括号名称。
于 2012-06-10T19:40:02.343 回答
1

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

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

gcc -std=c99 -pedantic -Wall -Wextra

gcc 至少会警告你;g++ 有类似的选项。

于 2012-06-10T20:07:14.883 回答