C言語で構造体をsizeofした値がおかしい

こんばんは。きわさです。

C言語の構造体のサイズ取得にハマったので、備忘録として残しておきます。
今回はC言語編です。

さて、まずはこれ。

printf("char: %d\n", sizeof(char));
printf("short: %d\n", sizeof(short));
printf("int: %d\n", sizeof(int));

結果は、こうなりました。
char: 1
short: 2
int: 4

では、
次は例えばこのような構造体が定義されていたとして、

typedef struct {
    char x1;
    char x2;
    char x3;
    char x4;
    char x5;
} st1_t;

typedef struct {
    short x1;
    short x2;
    int x3;
    char x4;
    char x5;
} st2_t;

typedef struct {
    char x1;
    int x2;
    char x3;
    short x4;
    int x5;
} st3_t;

typedef struct {
    short x1;
    int x2;
    char x3;
    int x4;
    short x5;
} st4_t;

 

結果はどうなるでしょう。

printf("st1_t: %d\n", sizeof(st1_t));
printf("st2_t: %d\n", sizeof(st2_t));
printf("st3_t: %d\n", sizeof(st3_t));
printf("st4_t: %d\n", sizeof(st4_t));

 

結果は、
st1_t: 5
st2_t: 10
st3_t: 12
st4_t: 13

 

。。。

 

に、なると思っていました。

が、なりませんでした。

 

結果は、
st1_t: 5
st2_t: 12
st3_t: 16
st4_t: 20

 

!?

 

そう、冴えない僕には理由もわからず、どハマりしました。

どうやらアラインメントが~、なんちゃら~、とのこと。

ここで詳しい解説は省きますが、
4バイト区切りでキリのよくなるようパディングされるらしい。

へ、へー、なるほどー。

そこで、このように、

#pragma pack(1)
typedef struct {
    char x1;
    char x2;
    char x3;
    char x4;
    char x5;
} st1_t;

typedef struct {
    short x1;
    short x2;
    int x3;
    char x4;
    char x5;
} st2_t;

typedef struct {
    char x1;
    int x2;
    char x3;
    short x4;
    int x5;
} st3_t;

typedef struct {
    short x1;
    int x2;
    char x3;
    int x4;
    short x5;
} st4_t;
#pragma pack()

この#pragma pack(1)で区切りを1にすることで、

結果、
st1_t: 5
st2_t: 10
st3_t: 12
st4_t: 13

になりましたとさ。

スポンサーリンク