柔軟な配列メンバーを持つ構造体は、明らかに宣言することを意図したものではなく、その構造体へのポインターと組み合わせて使用 することを意図しています。柔軟な配列メンバーを宣言するときは、少なくとも 1 つの他のメンバーが必要であり、柔軟な配列メンバーはその構造体の最後のメンバーでなければなりません。
次のようなものがあるとしましょう:
struct example{
int n;
int flm[];
}
それを使用するには、ポインタを宣言し、malloc を使用して構造体の内容用にメモリを予約する必要があります。
struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int));
つまり、flm[] 配列に 5 つの整数を保持させたい場合です。次に、次のように構造体を使用できます。
ptr->flm[0] = 1;
私の質問は、これの代わりにポインターを使用できるべきではないですか? C99 以前と互換性があるだけでなく、その構造体へのポインターの有無にかかわらず使用できます。私はすでに flm で malloc を使用しなければならないことを考えると、これを行うだけでよいのではないでしょうか?
example struct のこの新しい定義を考えてみましょう。
struct example{
int n;
int *notflm;
}
struct example test = {4, malloc(sizeof(int) * 5)};
柔軟な配列メンバーと同じ方法で置換を使用することもできます。
これも機能しますか?(notflm を使用した例の上記の定義を提供)
struct example test;
test.n = 4;
notflm = malloc(sizeof(int) * 5);