構造が定義されている、私は、構造はsizeofと呼ばれます。CのStructuresでsizeof()関数がどのように機能しますか?主な機能には</p> <pre><code>typedef struct Sample { int test; char strtest; } Sample; </code></pre> <p>を次のよう
構造体のsizeofの戻り値が正しくない可能性があると聞きました。このような場合は、適切な価値を得るために何をすべきですか?
構造が定義されている、私は、構造はsizeofと呼ばれます。CのStructuresでsizeof()関数がどのように機能しますか?主な機能には</p> <pre><code>typedef struct Sample { int test; char strtest; } Sample; </code></pre> <p>を次のよう
構造体のsizeofの戻り値が正しくない可能性があると聞きました。このような場合は、適切な価値を得るために何をすべきですか?
信頼できる値が返されます。必ずしも期待する値ではありません。
サンプル構造では、1バイトのcharと4バイトのintを仮定していますが、結果は "5"になりません。
要素が自然境界で始まるように構造体がパディングされているためです。 "8"という結果が得られる可能性が高くなります。
Wikiではこれを非常にうまく説明しています。http://en.wikipedia.org/wiki/Sizeof - 「構造パディング」の下部にあります。
Sizeofは関数ではありません。 オペレーターです。結果は常に正確ですが、パディングや、それが魔法の配列サイズの決定要因であるとの信念のため、予期しないこともあります。
演算子として、変数で動作する場合、かっこは必要ありません。
int foo;
printf("%zu\n", sizeof foo);
は完全に合法です。
あなたは 'sizeof'、'%d'で '%zu'を使うべきです、' sizeof'の変換指定は未定義です – ouah
sizeof
構造体型は他の型と同じように動作します。演算子の結果は、型のサイズ(バイト)です。構造タイプのサイズは、この構造タイプのオブジェクトのサイズと同じです。
sizeof
構造体オブジェクトは、パディングのために構造体型のさまざまな要素のサイズを超えることがあります。
は、すべての構造部材の後バイトの不特定多数のパディングが存在することができ、パディングは構造タイプの大きさに考慮される(または構造タイプのオブジェクトの)
はのサイズを印刷します構造タイプはprintf
フォーマット文字列でz
変換指定子を使用します。
printf("%zu\n", sizeof (struct my_structure_type));
ここでは、そのことについて少し詳細を読むことができます: http://somectips.wordpress.com/2012/01/05/what-is-the-size-of-struct/
で'Sample'は有効な型ではありません。 CコードにC++コンパイラを使用していますか?私はあなたがそれをしないことをお勧めします。もし 'Sample'がオブジェクトであれば、括弧は冗長です。 – pmg
sizeofは関数ではなく、コンパイラ指令です。 実行時には実行されませんが、コンパイル時には対応する値に置き換えられます。 – Rolice
決して「間違っている」ことはありません。コンパイラではなく、あなたの理解だけが欠けています。 –