2012-05-10 19 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])); 

私にはOKと思われるが、私がしなければ、コンパイラは文句はありませんので、私は少し懐疑的:

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それはひどい考えではありません、人々が間違ってそれを使用する場合、それはちょうど危険です。それが標準になる前にその目的のために 'struct'の最後のメンバーとして長さ1の配列を持つのは普通のハックでした。 gccは長さ0の配列を柔軟な配列メンバーとして長年受け入れていました。 –

答えて

5

それは大丈夫ではありません。 (n1570)にセクション6.7.2.1、ポイント3は

3構造体または共用体が(したがって、 構造自体のインスタンスを含んではならないが、含んでいてもよい不完全または機能タイプのメンバーを含んではならないと言います複数の名前付きメンバ を持つ構造体の最後のメンバが不完全な配列型を持つ場合を除いて、インスタンス のインスタンスへのポインタ)。そのような構造体(および可能であれば を含む任意の共用体は、そのような構造体であるメンバー)は、構造体のメンバーでも配列の要素でもないものとする。

したがって、柔軟な配列メンバーを持つstructは、別の構造体の一部ではない可能性があります。

(。コンパイラはそれを受け入れた場合これはよく、しかし、構造体の最後のメンバーとして働くことができる)

関連する問題