为什么空数组的大小为0但空类的大小不为0?

时间:2015-06-21 05:50:49

标签: c++ gcc g++

例如:

int main() {
  struct {} foo;
  int bar[0];
  struct {
    int dummy[0];
  } baz;
  cout << sizeof(foo) << endl; //display '1'
  cout << sizeof(bar) << endl; //display '0'
  cout << sizeof(baz) << endl; //display '0'
  return 0;
}

请告诉我有没有原因支持编译器行为

2 个答案:

答案 0 :(得分:11)

这是一个仅限C ++的问题。在C中,编译器禁止空struct

在C ++中,sizeof(foo) == 1的原因最终是为了使C ++标准的“无对象在内存中具有与任何其他变量相同的地址”的规则可以被强制执行。您可以阅读详细信息here

编辑:关于user2864740关于baz出现的评论,它应该也是非零是正确的。编译器允许空数组使得看起来没有像baz那样始终如一地将finessing规则应用于foo。事实上,这确实搞乱了指针算法。见这个例子:

// C++14 code
#include <iostream>
using namespace std;

int main() {
  struct baz {
    int dummy[1];
  };

  cout << sizeof(baz) << endl;

  baz* arr;
  arr = new baz[5];
  cout << &arr[0] << endl;
  cout << &arr[1] << endl;
  return 0;
}
// everything looks good
4
0x892c008
0x892c00c

但如果我们采用相同的代码并将baz内的数组更改为int dummy[0];,那么我们会得到此输出:

0
0x8fe3008
0x8fe3008

确实危险;这可能导致无限循环。建议你不要像这样顽皮,即使你已经找到了逃脱它的方法:)

答案 1 :(得分:2)

修改:假设g++

sizeof以字节http://en.cppreference.com/w/cpp/language/sizeof

返回对象的大小

空数组的大小为0,因为其中没有字节。 struct的大小通常不为零。如果编译器发现结构为空,那么它将报告零。

在您的情况下,编译器可以告诉结构中的字节数为零。因此,sizeof(bar)sizeof(baz)为零

另见http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#The-sizeof-Operator