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;
};
4

1 に答える 1

5

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

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

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

(ただし、コンパイラーがそれを受け入れる場合は、構造体の最後のメンバーとして機能する可能性があります。)

于 2012-05-10T21:04:47.953 に答える