43

C で sizeof を使用して構造体のサイズを取得しましたが、予期しない結果が得られました。

struct sdshdr {
    int len;
    int free;
    char buf[];
};


int main(){
    printf("struct len:%d\n",(sizeof(struct sdshdr)));
    return 0;
} //struct len:8, with or without buf

私の質問は、なぜbufスペースを占有しないのかint、64 ビット CPU でタイプのサイズがまだ 4 なのかということです。

からの出力は次のgcc -vとおりです。

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix  
4

4 に答える 4

2

GNU c の拡張として、長さゼロの配列があります。

GNU の拡張機能として、要素の数を 0 まで小さくすることができます。長さゼロの配列は、実際には可変長オブジェクトのヘッダーである構造体の最後の要素として役立ちます。

たとえば、gnu c マニュアルの次のコードを考えてみましょう。

 struct line
 {
   int length;
   char contents[0];
 };

 {
   struct line *this_line = (struct line *)
     malloc (sizeof (struct line) + this_length);
   this_line -> length = this_length;
 }

ISO C99 では、柔軟な配列メンバーを使用しますが、これは構文とセマンティクスがわずかに異なります。

  • 柔軟な配列メンバーは、0 なしで contents[] として書き込まれます。

  • 柔軟な配列メンバーには不完全な型があるため、sizeof 演算子が適用されない場合があります。長さゼロの配列の元の実装の癖として、sizeof はゼロに評価されます。

  • 柔軟な配列メンバーは、それ以外の場合は空でない構造体の最後のメンバーとしてのみ表示されます。

  • 柔軟な配列メンバーを含む構造体、またはそのような構造体を (場合によっては再帰的に) 含む共用体は、構造体のメンバーまたは配列の要素にすることはできません。(ただし、これらの使用は GCC によって拡張機能として許可されています。)

于 2015-07-09T13:21:44.143 に答える