1

次の 2 つの構造を検討してください。

typedef struct { 
    int num_data;
    char * name_data;
    int data[]; 
} part_t; 
typedef struct { 
    int num_parts;
    char * name_parts;
    part_t parts[]; 
} container_t; 

理想的には、次のようにコンテナを初期化できます。

const container_t container = { 
    2,
    "Name of first container", 
    { 
            { 4, "Name of first part", { 1, 2, 3, 4 } }, 
            { 5, "Name of first part", { 1, 2, 3, 4, 5 } } 
    } 
};

私のコンパイラは言う:「エラー:初期化子が多すぎます」

4

1 に答える 1

4

ISO / IEC 9899:2011§6.7.2.1構造およびユニオン指定子

3構造体またはユニオンには、不完全または関数型のメンバーを含めることはできません(したがって、構造体にはそれ自体のインスタンスを含めることはできませんが、それ自体のインスタンスへのポインターを含めることができます)。複数の名前付きメンバーの配列型が不完全である可能性があります。そのような構造体(および、場合によっては再帰的にそのような構造体であるメンバーを含むユニオン)は、構造体のメンバーまたは配列の要素であってはなりません。

18特殊なケースとして、複数の名前付きメンバーを持つ構造体の最後の要素は、不完全な配列型を持つ場合があります。これは、柔軟な配列メンバーと呼ばれます。ほとんどの場合、柔軟な配列メンバーは無視されます。特に、構造のサイズは、省略が意味するよりも多くの末尾のパディングがある場合を除いて、フレキシブルアレイメンバーが省略されたかのようになります。ただし、。(または->)演算子には、柔軟な配列メンバーを持つ構造体(へのポインター)である左オペランドがあり、右オペランドはそのメンバーに名前を付けます。そのメンバーが(同じ要素タイプの)最長の配列に置き換えられたかのように動作します。 )アクセスされているオブジェクトよりも構造が大きくなることはありません。配列のオフセットは、柔軟な配列メンバーのオフセットのままでなければなりません。これが置換アレイのそれと異なる場合でも。この配列に要素がない場合、要素が1つあるかのように動作しますが、その要素にアクセスしたり、その要素の1つ先にポインターを生成したりしようとすると、動作は定義されません。

問題は、柔軟な配列メンバーを持つ構造体を配列または別の構造体に埋め込むことができないことです。そのような構造へのポインタを持つことはできますが、そのような構造のインスタンスを持つことはできません。

于 2012-12-04T23:48:23.117 に答える