C++ 数组初始化[c/c+;+;]

C++ 数组初始化[c/c+;+;],c++,c,C++,C,为什么这是不允许的 #include <cstdio> struct Foo { int fooId; char arr[ ]; } fooList[] = { {1, {'a', 'b'}}, {2, {'c', 'd'}} }; int main() { for (int i = 0; i < 2; i++) printf("%d %c\n", fooList[i].fooId, fooList[i].arr[0]); } 只有C结构的最后一个成员可以

为什么这是不允许的

#include <cstdio>

struct Foo {
int fooId;
char arr[ ];
} fooList[] =
{ {1, {'a', 'b'}},
  {2, {'c', 'd'}}
};

int main()
{
  for (int i = 0; i < 2; i++)
    printf("%d %c\n", fooList[i].fooId, fooList[i].arr[0]);
}
只有C结构的最后一个成员可以灵活,如
arr[]
中所示

无耻地抄袭ISO C99标准第16小节第6.7.2.1段:

16作为特例,最后一个元素 指具有多个结构的结构 命名成员可能具有不完整的 数组类型;这被称为弹性体 数组成员。除了两个例外, 将忽略灵活数组成员。 首先,结构的尺寸应 等于最后一个的偏移量 在其他方面相同的元素 结构,取代了灵活的 数组成员,其数组为 未指定长度。106)

编辑:


<>关于C++,参见。底线:在C++ C++中不允许使用灵活的数组成员。至少在C++ 03中,

,这在结构或类中是不允许的!p> COMUE C++编译器给出了这个错误: “ComeauTest.c”,第3行:错误: 不允许使用不完整的类型 char-arr[]; ^

昨天的一个简单问题:C++中的

< p>所有用户定义类型的成员都必须有完整的类型,并且成员<代码> ARR < /C>除非您给它一个大小,否则它没有完整的类型。 在C中,结构定义可以编译,但您可能无法得到所需的内容。问题是,允许在结构末尾使用不带大小的数组作为代理来访问实例之后的连续内存块。这允许哑向量实现为:

typedef struct vector {
   int size;
   char buffer[];
} vector;
vector* create_vector( int size ) {
   vector* p = (vector*) malloc( sizeof *p + size ); // manually allocate "size" extra
   p->size = size;
};
int main() {
   vector* v = create_vector(10);
   for ( int i = 0; i < v->size; ++i )
      printf("%d\n", v->buffer[i] );
   free(v);
}

谢谢,在我看到你编辑的文本之前,我就发表了评论;)我认为C++是错误的吗?在C中,你可以任意大小的内存,并把你的结构放在那里,而在C++中,New总是分配SIZEOF(Stult)内存。你可以用C89允许的方式来破解它(这是不足为奇的,因为C++ 98是基于C89),但是这个添加到C99只是不有效的C++,还没有被并入C++ 0x.@弗莱德:我想你是指通过<代码> [1 ] < /Cord>数组和分配额外的内存。谢谢你提供的信息。@Fred Nurk,它没有也永远不会被纳入语言中。这里的问题与可变长度数组相同,它们会破坏类型系统。目前,数组的大小是该类型的一部分,在编译时是已知的,如果被替换,那么这些特定类型的数组将无法用于编译时构造(请考虑
template int size_array(T(&)[size]){return size;}
。一如既往,它可以在标准中说明,但这将创建第二个不同的“数组”公民C和C++在这里是不同的。你感兴趣的是哪一个?这只是为了学习,所以这里的不同是很有趣的。我强烈地不愿说它被用作指针,以免初学者再次被数组和指针所绊倒。即使成员名(上面的“缓冲区”)用于引用对象后面的内存,这与指针的指向类型不同。@Fred Nurk:我同意,如果读取数组作为指针,可能会导致混淆,因此我已重新编写,即使在这一阶段实际发生的情况是:数组用作指针(该成员的唯一用途是那些需要数组衰减为指针的用途) "ComeauTest.c", line 3: error: incomplete type is not allowed char arr[ ]; ^
typedef struct vector {
   int size;
   char buffer[];
} vector;
vector* create_vector( int size ) {
   vector* p = (vector*) malloc( sizeof *p + size ); // manually allocate "size" extra
   p->size = size;
};
int main() {
   vector* v = create_vector(10);
   for ( int i = 0; i < v->size; ++i )
      printf("%d\n", v->buffer[i] );
   free(v);
}
printf( "sizeof(vector)=%d\n", sizeof(vector) ); // == sizeof(int)