Quando stampo le dimensioni di un'unione come questa:Perché le dimensioni della mia unione sono più grandi di quanto mi aspettassi?
union u {
char c[5];
int i;
} un;
utilizza questo:
int _tmain(int argc, _TCHAR* argv[])
{
printf("size of union = %d ",sizeof(un));
return 0;
}
ricevo una risposta di 8 utilizzando Visual C++, ma mi aspettavo 5. Perché?
Beh, per lo stesso esempio, ho fatto qualcosa di simile:
int i1 = 0x98761234;
un.i = i1;
printf("\n un.c[0] = %x ",un.c[0]);
printf("\n un.c[1] = %x ",un.c[1]);
printf("\n un.c[2]= %x ",un.c[2]);
printf("\n un.c[3] = %x ",un.c[3]);
printf("\n un.c[4] = %x ",un.c[4]);
printf("size of union = %d ",sizeof(un));
ho ottenuto risultati come
un.c[0] = 34;
un.c[1] = 12;
un.c[2] = 76;
un.c[3] = ffffff98;
Perché ci sono 6FS a un.c [3]
Supponendo integer a 4 byte, il membro più grande è c, che è 5 byte. Il compilatore arrotonda questo fino a 8 aggiungendo padding. Se il sistema utilizza interi a 8 byte, 8 viene utilizzato per le dimensioni dell'unione. –
@Brian Ho cambiato la mia risposta poco prima di commentare "il tipo di membro più grande", per indicare più chiaramente un int. –
Non so, continuo a non pensare che la tua risposta sia chiara o corretta. Tu dici che il membro più grande è un int, ma non lo è. È una matrice di 5 caratteri. Dal 5> 4 si arrotonda al prossimo multiplo della dimensione nativa della parola, il che lo rende 8. –