[英]Why does static initialization of flexible array member work?
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\n", Main.title);
printf("%s\n", Main.submenu[0]->title);
printf("%s\n", 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?
这是禁言吗?
I am using MinGW gcc 4.6.1 and compiling under C99 rules.我正在使用 MinGW gcc 4.6.1 并在 C99 规则下编译。
Initialization of flexible array member in this way is not allowed as per C standard.根据 C 标准,不允许以这种方式初始化灵活的数组成员。
21 EXAMPLE 2 After the declaration:
21 例 2 声明后:
struct s { int n; double d[]; };
the structure struct
s
has a flexible array memberd
.结构 struct
s
有一个灵活的数组成员d
。 [...][...]
22 Following the above declaration:
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
The initialization of
t2
is invalid (and violates a constraint) becausestruct s
is treated as if it did not contain memberd
.t2
的初始化无效(并违反约束),因为struct s
被视为不包含成员d
。 [...][...]
But, GCC allows the static initialization of flexible array:但是,GCC 允许灵活数组的静态初始化:
Instead GCC allows static initialization of flexible array members .
相反, GCC 允许灵活的数组成员的静态初始化。 This is equivalent to defining a new structure containing the original structure followed by an array of sufficient size to contain the data.
这相当于定义一个包含原始结构的新结构,后跟一个足够大的数组来包含数据。 Eg in the following,
f1
is constructed as if it were declared likef2
.例如,在下面,
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 } };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.