3

私のコード:

typedef struct {
    int sizeOfMyIntArray;
    int* myIntArray;
    float someFloat;
} my_struct_foo;

int main() {
    printf("The size of float is: %d\n", sizeof(float));
    printf("The size of int is: %d\n", sizeof(int));
    printf("The size of int* is: %d\n", sizeof(int*));
    printf("The size of my_struct_foo is: %d\n", sizeof(my_struct_foo));
    return 0;
}

これはとても簡単だと思います。しかし、私はこのプログラムの結果の出力に少し驚いています...

The size of float is: 4
The size of int is: 4
The size of int* is: 8
The size of my_struct_foo is: 24

1つのfloat、1つのint、および1つのintへのポインターがあります。私の頭の中で私は考えています:4 + 4 + 8 = 16 ... 24ではありません。なぜ私の構造のサイズは16ではなく24なのですか?

4

1 に答える 1

2

位置合わせとパディング。はint*8バイト境界に揃える必要があるため、コンパイラはintとポインタの間に4バイトのパディングを挿入floatし、構造体のサイズをポインタサイズの倍数にして、ポインタを正しく配置します。整列。

メンバーを並べ替える場合は、

typedef struct {
    int sizeOfMyIntArray;
    float someFloat;
    int* myIntArray;
} my_struct_foo;

ポインタはパディングなしで正しく整列されるため、構造体のサイズは(おそらく、コンパイラはパディングが不要な場合でも追加できますが、追加することはできません)16になります。

于 2012-10-13T23:27:47.710 に答える