次のような構造体があります。
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 の場合も同じだと思います) は、「柔軟な配列メンバー」と呼ばれる特別なケースであり、リンクされた質問と他の回答で説明されています。