Khi tôi in kích thước của một liên minh như thế này:Tại sao kích thước của công đoàn tôi lớn hơn tôi mong đợi?
union u {
char c[5];
int i;
} un;
sử dụng này:
int _tmain(int argc, _TCHAR* argv[])
{
printf("size of union = %d ",sizeof(un));
return 0;
}
tôi nhận được một câu trả lời của 8 sử dụng Visual C++, nhưng tôi mong đợi 5. Tại sao?
Vâng, đối với các ví dụ tương tự, tôi đã làm một cái gì đó như thế này:
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));
tôi đã nhận kết quả như
un.c[0] = 34;
un.c[1] = 12;
un.c[2] = 76;
un.c[3] = ffffff98;
tại sao có 6fs tại un.c [3]
Giả sử số nguyên 4 byte, thành viên lớn nhất là c, đó là 5 byte. Trình biên dịch làm tròn lên đến 8 bằng cách thêm phần đệm. Nếu hệ thống đang sử dụng các số nguyên 8 byte, thì 8 được sử dụng cho kích thước công đoàn. –
@Brian Tôi đã thay đổi câu trả lời của mình ngay trước khi bạn nhận xét là "loại thành viên lớn nhất", để chỉ ra rõ ràng hơn một int. –
Tôi không biết, tôi vẫn không nghĩ câu trả lời của bạn rõ ràng hay chính xác. Bạn nói thành viên lớn nhất là một int, nhưng nó không phải là. Nó là một mảng gồm 5 ký tự. Vì 5> 4 nó làm tròn tới bội số tiếp theo của kích thước từ gốc, làm cho nó trở thành 8. –