问题描述
我为菜单编写了以下基本代码:
I have written the following basic code for a menu:
typedef struct Menu {
char* title;
unsigned num_submenus;
struct Menu *submenu[];
} Menu;
Menu sub1 = {"Submenu 1", 0, {NULL}};
Menu sub2 = {"Submenu 2", 0, {NULL}};
Menu Main = {"Main Menu", 2, {&sub1, &sub2}}; /* No Error?! */
int main()
{
printf("%s
", Main.title);
printf("%s
", Main.submenu[0]->title);
printf("%s
", Main.submenu[1]->title);
}
浏览一些相关问题,似乎使用灵活数组成员的唯一方法是为其动态分配内存.然而,我的编译器非常乐意编译和运行代码,没有任何错误或警告.这是禁止的吗?
Browsing through a few related questions it seems like the only way to use a flexible array member is to dynamically allocate memory to it. However my compiler is perfectly happy to compile and run the code without any errors or warnings. Is this verboten?
我使用的是 MinGW gcc 4.6.1 并在 C99 规则下编译.
I am using MinGW gcc 4.6.1 and compiling under C99 rules.
推荐答案
C 标准不允许以这种方式初始化灵活数组成员.
Initialization of flexible array member in this way is not allowed as per C standard.
21 示例 2 声明后:
struct s { int n; double d[]; };
结构struct s
有一个灵活的数组成员d
.[...]
the structure struct s
has a flexible array member d
. [...]
22 遵循上述声明:
struct s t1 = { 0 }; // valid
struct s t2 = { 1, { 4.2 }}; // invalid
t1.n = 4; // valid
t1.d[0] = 4.2; // might be undefined behavior
t2
的初始化无效(并违反约束),因为 struct s
被视为不包含成员 >d
.[...]
The initialization of t2
is invalid (and violates a constraint) because struct s
is treated as if it did not contain member d
. [...]
但是,GCC 允许灵活数组的静态初始化:
But, GCC allows the static initialization of flexible array:
相反,GCC 允许灵活数组成员的静态初始化.这等效于定义一个包含原始结构的新结构,然后是一个足够大的数组来包含数据.例如.在下面,f1
的构造就像它被声明为 f2
一样.
struct f1 {
int x;
int y[];
} f1 = { 1, { 2, 3, 4 } };
struct f2 {
struct f1 f1;
int data[3];
} f2 = { { 1 }, { 2, 3, 4 } };
这篇关于为什么灵活数组成员的静态初始化工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!