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

sud*_*03r 4 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]);
}
Run Code Online (Sandbox Code Playgroud)

然而,这是允许的:

struct Foo {
int fooId;
char arr[2]; // this line modified
} fooList[] =
{ {1, {'a', 'b'}},
  {2, {'c', 'd'}}
};
Run Code Online (Sandbox Code Playgroud)

thk*_*ala 15

只有C结构的最后一个成员可以灵活,如arr[].

无耻地复制ISO C99标准第6.7.2.1段第16段:

16作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的阵列成员.除了两个例外,灵活的数组成员将被忽略.首先,结构的大小应该等于其他相同结构的最后一个元素的偏移量,该结构用一个未指定长度的数组替换柔性数组成员.106)...

编辑:

至于C++,请看这个.底线:C++中根本不允许使用灵活的数组成员 - 至少目前是这样.