2012-05-10 117 views
3

下面的代碼有效嗎?在另一個結構中具有一個靈活數組成員的結構

struct foo { 
    int a; 
    int b[]; 
}; 

struct bar { 
    int c; 
    struct foo d; 
}; 

struct bar *x = malloc(sizeof(struct bar) + sizeof(int [128])); 

它似乎確定給我,但我有點懷疑,因爲如果我這樣做編譯器不抱怨:

struct bar { 
    struct foo d; 
    int c; 
}; 
+1

@Shahbaz:否,'INT B []'是*不*一樣'INT * B'。這個構造被稱爲*靈活數組成員*。 http://www.c-faq.com/struct/structhack.html – jamesdlin

+0

@ jamesdlin,不知道!但這似乎是一個可怕的想法。他們怎麼能使它成爲標準? – Shahbaz

+0

@Shahbaz這不是一個可怕的想法,如果人們錯誤地使用它,那就很危險。在成爲標準之前,將長度爲1的數組作爲'struct'的最後一個成員用於此目的是一種常見的攻擊。 gcc很早就接受了長度爲0的數組作爲靈活的數組成員。 –

回答

5

這是不行的。節6.7.2.1(在n1570),點3表示

3所述的結構或聯合不得含有具有不完整或功能類型的成員(因此, 的結構不應含有自己的一個實例,但也可以含有一個指向它本身的實例 的指針),除了具有多於一個命名成員 的結構的最後一個成員可能具有不完整的數組類型;這樣的結構(以及任何包含,可能是遞歸地包含這種結構的成員的聯合)不應該是數組的結構或元素的成員。

因此,具有靈活數組成員的struct可能不是另一個結構的一部分。

(它可能很好地工作作爲一個結構的最後一個部件,但是,如果編譯器接受它。)

相關問題