今まで知らずに生きてきたので、恥さらしも含めてまとめておきます。結論から言うと、当たり前のことですが構造体のサイズはsizeof()を使って取得しましょう(サイズを定数で記述しないこと)。
構造体のサイズはきり良く決められる
構造体のサイズは、内部に格納された型(メンバ)の単純な合計サイズではありません。次のコードを見てください。
#include <stdio.h> struct{ char c; int i; } s; main(){ printf("char: %d\n", sizeof(s.c)); printf("int : %d\n", sizeof(s.i)); printf("s : %d\n", sizeof(s)); } /* char: 1 int : 4 s : 8 */
1 + 4 ≠ 8
違いますね。では、次はどうでしょうか。次のほうが、挙動をより理解しやすいと思います。
#include <stdio.h> struct{ char c; int i; char c2, c3; } s; struct{ char c, c2, c3; int i; } s2; main(){ printf("s : %d\n", sizeof(s)); printf("s2 : %d\n", sizeof(s2)); } /* s : 12 s2 : 8 */
なにやら、メンバを宣言する順番が違うだけで、構造体自体のサイズが大きく変わってくるようです。メモリの配置上の問題で、特定の整数倍(バイト境界)に合うようパディング(余白?)が入るようです。詳しいことは、http://www.g-ishihara.com/c_st_01.htmここがわかりやすかったです。私がここでごちゃごちゃ書くより、はるかに理解しやすいと思います。
常にsizeof()を用いるという当たり前のことをしていれば問題ないので、普段気にすることではなさそうです。ただ、バイト境界を意識したメンバの宣言順にしておけば、もしかしたらメモリの節約になる場面が出てくるかもしれませんね。
いままでどうしてたのが気になる