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の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。

  1. A6 6
  2. B9 6
  3. 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バイトです。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  2. 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
  3. #define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
  4. ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
  5. 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。