簡體   English   中英

為什么靈活數組成員的靜態初始化工作?

[英]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 標准,不允許以這種方式初始化靈活的數組成員。

C11:6.7.2.1 結構和聯合說明符 (p20-21):

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 手冊:6.17 長度為零的數組

相反, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM