次のような構造体があります。
struct sdshdr {
int len;
int free;
char buf[];
};
の結果printf ("%d\n", sizeof(struct sdshdr));
は 8 です。 に変更char buf[]
するchar *
と、結果は 16 になります。なぜchar buf[]
ここでスペースを取らないのですか (はsizeof(int)
4) ?char buf[]
char *buf
次のような構造体があります。
struct sdshdr {
int len;
int free;
char buf[];
};
の結果printf ("%d\n", sizeof(struct sdshdr));
は 8 です。 に変更char buf[]
するchar *
と、結果は 16 になります。なぜchar buf[]
ここでスペースを取らないのですか (はsizeof(int)
4) ?char buf[]
char *buf
空の括弧[]
を含む構成は、 の最後の要素として許可されstruct
ます。配列の要素を超えて追加のスペースを割り当てることができsizeof(sdshdr)
、配列データを配列自体に埋め込むことができます。
一方、ポインターは、データを個別に管理されたメモリ セグメントに格納free
し、最後に追加の呼び出しを必要とします。方法とは異なり[]
、ポインターを使用すると、同じ 内に複数の可変長配列を含めるstruct
ことができ、要素はstruct
の末尾だけでなく、の任意の場所に配置できますstruct
。
sizeof
また、コンパイル時に決定する必要があることも忘れないでください。は柔軟な配列メンバであるためchar buf[]
、コンパイル時にそのサイズを知ることができないため、 の計算から省略されますsizeof
。
char *
は char 変数へのポインターであり、そのサイズは既知であるため含まれています (ただし、ポインターが指す配列ではなくポインターのサイズです)。
" char[]
" をより一般的に解釈すると、次のようになります。
char[]
実際には、構造体内にいくつかの文字を割り当てます。(構造体 withchar x[17]
は 17 バイトずつ大きくなります。) Achar*
はポインタを保持するだけです。
構造体の最後にある実際のchar x[]
(サイズが指定されていない - サイズ 0 の場合も同じだと思います) は、「柔軟な配列メンバー」と呼ばれる特別なケースであり、リンクされた質問と他の回答で説明されています。