これらの構造体へのポインタのリストの中間配列を作成せずに構造体の配列を初期化するにはどうすればよいですか?私はsturctsをshape_tへのポインタの配列を指すように.elementsメンバーが必要ですが、このコードはコンパイルされません構造体へのポインタの配列を初期化
snippets $ cat a2p.c
struct shape {
int angles;
char shape_name[16];
};
typedef struct shape shape_t;
struct container {
char name[32];
shape_t **elements;
int num_elts;
};
typedef struct container container_t;
shape_t triangle = {
.angles = 3,
.shape_name = {"Triangle"}
};
shape_t rectangle = {
.angles = 4,
.shape_name = {"Rectangle"}
};
container_t c = {
.name = {"Case"},
.elements = {
&triangle,
&rectangle
},
.num_elts =2
};
int main(void) {
return 0;
}
:
snippets $ gcc -c a2p.c
a2p.c:24:2: warning: braces around scalar initializer
.elements = {
^
a2p.c:24:2: note: (near initialization for ‘c.elements’)
a2p.c:25:3: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
&triangle,
^
a2p.c:25:3: note: (near initialization for ‘c.elements’)
a2p.c:26:3: warning: excess elements in scalar initializer
&rectangle
^
a2p.c:26:3: note: (near initialization for ‘c.elements’)
snippets $
しかし、私が追加した場合、次のコード例を考えてみましょうこのような中間配列:
shape_t *shapes[] = {
&triangle,
&rectangle
};
container_t c = {
.name = {"Case"},
.elements = shapes,
.num_elts =2
};
コードはokです。中間のステップとしてshapes []配列を作成し、最初のコードスニペットのようにすべてのデータを直接container_tを初期化するのを避けることはできますか?その後、正しい初期化構文は何でしょうか?
'elements'は、構造体の配列ではなく、ポインタの配列へのポインタです。 – Barmar
配列とポインタは同じものではありません。配列は特定のコンテキストではポインタへと減衰しますが、初期化リストでは配列リテラルは減衰しません。 – Barmar
@Barmar私がメモリ内に構築したい階層の種類を理解していて、その答えを知っていれば、それを分けてください。 TIA – Nulik