2016-11-15 5 views
0

sizeof(t1)= 16 sizeof(t2)= 16 sizeof(fpos_t)= 8となるためsizeof(t2)= 12と予想されます。 sizeof(int)= 4。誰かがこれを説明できますか?MVCの結果が奇妙な

int main() 
{ 
    typedef struct { 
     fpos_t fpos; 
     char* s; 
     int a; 
    } t1; 
    typedef struct { 
     fpos_t fpos; 
     int a; 
    } t2; 
    t1 it1; 
    t2 it2; 
    printf("sizeof(t1)=%d sizeof(t2)=%d ", sizeof(t1), sizeof(t2)); 
    return 0; 
} 
+0

1単語で説明できます:*パディング* –

答えて

0

alignment reasonsの場合、コンパイラはパディングを自由に挿入できます。つまり、構造体のサイズは必ずしも個々のメンバーのサイズの合計と等しいわけではありません。これは、C標準によって明示的に許可されています。

構造体の先頭、つまり最初のメンバーの前にパディングが許可されない唯一の場所です。 C11 draft, 6.7.2.1から

構造オブジェクト内、非ビットフィールドメンバーと ビットフィールド内のユニットは、それらが宣言されている 順に増加アドレスを持って存在します。適切に が変換された構造オブジェクトへのポインタは、その最初のメンバ(またはそのメンバが ビットフィールドである場合はそれが存在するユニット)を指し、その逆の場合も同様です。 ストラクチャオブジェクト内に無名のパディングがありますが、その先頭には がありません。

(強調鉱山)。

0

今日のほとんどのコンピュータでは、一度に「単語」(別名8バイト、別名64ビット)での割り当てしかできません。それはパディングと呼ばれています。

ホテルの部屋と考える。同じ部屋(memory location)に1〜2人(chars)滞在している場合でも、部屋は同じサイズになります。