0

重複の可能性:
構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか?

私は次のコードを持っています:

http://ideone.com/brmRy

#include <stdio.h>
#include <stdlib.h>
 
typedef struct Test
{
        int a;
        int b;
        char c;
} Test;
 
int main(void)
{
        Test *obj = (Test*)malloc(sizeof(Test));
 
        printf("Size results:\r\n\r\nstruct: %i\r\nint #1: %i\r\nint #2: %i\r\nchar #1: %i\r\n", 
                sizeof(Test), sizeof(obj->a), sizeof(obj->b), sizeof(obj->c));
 
        return 0;
}

結果は次のとおりです。

サイズ結果:

構造体: 12

整数 #1: 4

整数 #2: 4

文字 #1: 1

構造体サイズが12バイトなのはなぜですか??? int - 4 バイト char - 1 バイト

2 int + 1 char = 2 * 4 バイト + 1 バイト = 9 バイト。

なぜ 12 ???

4

2 に答える 2

2

メモリは一般に 4 バイト境界で整列されるため、char は 1 バイトしか占有しませんが、このセグメンテーション要件を満たすために 3 バイトでパディングされます。特に、構造体の個々の要素は整列する必要がないため、int の 1 つを short にすると、構造体のサイズを 12 バイトから 8 バイトに減らすことができます。ただし、このボーナスを受け取るには、構造体宣言の char の隣に short を配置する必要があると思います。

于 2012-09-22T14:51:29.900 に答える
1

gcc を使用している場合は、「パッキング」を強制できます。これは、nalignment が行われず、構造体エントリが互いに隣り合っていることを意味します。試す

typedef struct Test
{
    int a;
    int b;
    char c;
} __attribute__((packed)) Test;
于 2012-09-22T15:16:12.120 に答える