4

次のような構造体があります。

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

4

3 に答える 3

4

空の括弧[]を含む構成は、 の最後の要素として許可されstructます。配列の要素を超えて追加のスペースを割り当てることができsizeof(sdshdr)、配列データを配列自体に埋め込むことができます。

一方、ポインターは、データを個別に管理されたメモリ セグメントに格納freeし、最後に追加の呼び出しを必要とします。方法とは異なり[]、ポインターを使用すると、同じ 内に複数の可変長配列を含めるstructことができ、要素はstructの末尾だけでなく、の任意の場所に配置できますstruct

于 2013-03-11T01:38:58.573 に答える
1

sizeofまた、コンパイル時に決定する必要があることも忘れないでください。は柔軟な配列メンバであるためchar buf[]、コンパイル時にそのサイズを知ることができないため、 の計算から省略されますsizeof

char *は char 変数へのポインターであり、そのサイズは既知であるため含まれています (ただし、ポインターが指す配列ではなくポインターのサイズです)。

于 2013-03-11T01:46:25.070 に答える
1

" char[]" をより一般的に解釈すると、次のようになります。

char[]実際には、構造体内にいくつかの文字を割り当てます。(構造体 withchar x[17]は 17 バイトずつ大きくなります。) Achar*はポインタを保持するだけです。

構造体の最後にある実際のchar x[](サイズが指定されていない - サイズ 0 の場合も同じだと思います) は、「柔軟な配列メンバー」と呼ばれる特別なケースであり、リンクされた質問と他の回答で説明されています。

于 2013-03-11T01:42:34.650 に答える