C言語の基礎
struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。
- A6 6
- B9 6
- C12 8
答えと解説を見る
正解:C. 12 8
int は番地が4の倍数になるように置かれるので、struct S では c の後に3バイトの詰め物(パディング)が入り、i は先頭から4バイト目、d は8バイト目に置かれます。さらに、構造体を配列に並べても各要素の i がそろうように全体の大きさも4の倍数に切り上げられ、9バイトの後に3バイトが足されて12バイトになります。struct T では i の後に c と d が続いて6バイトになり、切り上げて8バイトです。メンバを大きい型から順に並べると、パディングを減らせます。
- A. パディングを考えず、メンバの大きさを足しただけの値です(1 + 4 + 1 = 6)。
- B. int の前のパディングだけを考え、全体を4の倍数に切り上げなかった場合の値です。
- C. 正しい。S は詰め物を含めて12バイト、T は8バイトです。