编译器错误 C2229

类型“identifier”具有非法的零大小数组

结构或位域的成员包含不是最后一个成员的零大小数组。

由于可以将零大小数组作为结构的最后一个成员,因此在分配结构时必须指定其大小。

如果零大小数组不是结构的最后一个成员,则编译器无法计算剩余字段的偏移量。

下面的示例生成 C2229:

// C2229.cpp
struct S {
   int a[0];  // C2229  zero-sized array
   int b[1];
};

struct S2 {
   int a;
   int b[0];
};

int main() {
   // allocate 7 elements for b field
   S2* s2 = (S2*)new int[sizeof(S2) + 7*sizeof(int)];
   s2->b[6] = 100;
}