構造体のサイズはsizeofをちゃんと使うべき

以下のコードはApple LLVM version 6.1.0 (clang-602.0.53)で8と12を出力します。
ですが、intは4byte、boolは1byteなのでStは5byte、StStは6byteしか使わないため、サイズが増えてしまっています。

#include "stdio.h"

struct St{
	int a;
	bool flag;
	};

struct StSt{
	S s;
	bool f;
};

int main(void) {
	printf("%lu\n", sizeof(St));
	printf("%lu\n", sizeof(StSt));
	return 0;
}

原因

Cでは構造体の後ろにパディングを追加できるようになっています。
6.7.2.1 Structure and union specifiers

13 Within a structure object, the non-bit-field members and the units in which bit-fields
reside have addresses that increase in the order in which they are declared. A pointer to a
structure object, suitably converted, points to its initial member (or if that member is a
bit-field, then to the unit in which it resides), and vice versa. There may be unnamed
padding within a structure object, but not at its beginning.

そのため、sizeofがパディングを含めた値を返し、変数の合計とは違った値を返してきます。
このように、Cの構造体の大きさはではメンバの合計とは違うため、ちゃんとsizeofを使って計算しないと大変な事になります。1

参考資料


  1. EXP03-C. 構造体のサイズが構造体のメンバのサイズの和に等しいと決めてかからない ↩︎