[英]Why does static initialization of flexible array member work?
我為菜單編寫了以下基本代碼:
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);
}
瀏覽一些相關問題,似乎使用靈活數組成員的唯一方法是為其動態分配內存。 然而,我的編譯器非常樂意編譯和運行代碼而沒有任何錯誤或警告。 這是禁言嗎?
我正在使用 MinGW gcc 4.6.1 並在 C99 規則下編譯。
根據 C 標准,不允許以這種方式初始化靈活的數組成員。
21 例 2 聲明后:
struct s { int n; double d[]; };
結構 struct
s
有一個靈活的數組成員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
。 [...]
但是,GCC 允許靈活數組的靜態初始化:
相反, 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 } };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.