2012-01-04 10 views
6

構造が定義されている、私は、構造はsizeofと呼ばれます。CのStructuresでsizeof()関数がどのように機能しますか?主な機能には</p> <pre><code>typedef struct Sample { int test; char strtest; } Sample; </code></pre> <p>を次のよう

構造体のsizeofの戻り値が正しくない可能性があると聞きました。このような場合は、適切な価値を得るために何をすべきですか?

+1

で'Sample'は有効な型ではありません。 CコードにC++コンパイラを使用していますか?私はあなたがそれをしないことをお勧めします。もし 'Sample'がオブジェクトであれば、括弧は冗長です。 – pmg

+0

sizeofは関数ではなく、コンパイラ指令です。 実行時には実行されませんが、コンパイル時には対応する値に置き換えられます。 – Rolice

+0

決して「間違っている」ことはありません。コンパイラではなく、あなたの理解だけが欠けています。 –

答えて

22

信頼できる値が返されます。必ずしも期待する値ではありません。

サンプル構造では、1バイトのcharと4バイトのintを仮定していますが、結果は "5"になりません。

要素が自然境界で始まるように構造体がパディングされているためです。 "8"という結果が得られる可能性が高くなります。

Wikiではこれを非常にうまく説明しています。http://en.wikipedia.org/wiki/Sizeof - 「構造パディング」の下部にあります。

+0

@ Karthik:プラットフォームに依存しませんか? – Karai

+0

いいえ、プラットフォームに依存しません。それは必ずしもコンパイラに依存していません。 –

+0

@アーネスト:あなたの考えを説明することができます – Karai

1

Sizeofは関数ではありません。 オペレーターです。結果は常に正確ですが、パディングや、それが魔法の配列サイズの決定要因であるとの信念のため、予期しないこともあります。

演算子として、変数で動作する場合、かっこは必要ありません。

int foo; 
printf("%zu\n", sizeof foo); 

は完全に合法です。

+0

あなたは 'sizeof'、'%d'で '%zu'を使うべきです、' sizeof'の変換指定は未定義です – ouah

1

sizeof構造体型は他の型と同じように動作します。演算子の結果は、型のサイズ(バイト)です。構造タイプのサイズは、この構造タイプのオブジェクトのサイズと同じです。

sizeof構造体オブジェクトは、パディングのために構造体型のさまざまな要素のサイズを超えることがあります。

は、すべての構造部材の後バイトの不特定多数のパディングが存在することができ、パディングは構造タイプの大きさに考慮される(または構造タイプのオブジェクトの)

はのサイズを印刷します構造タイプはprintfフォーマット文字列でz変換指定子を使用します。

printf("%zu\n", sizeof (struct my_structure_type)); 
関連する問題

 関連する問題