面试题答案
一键面试#include <stdio.h>
// 定义联合体
union MyUnion {
struct {
short num1;
short num2;
} myStruct;
int num;
};
int main() {
union MyUnion u;
// 初始化结构体成员
u.myStruct.num1 = 100;
u.myStruct.num2 = 200;
// 通过整型成员读取联合体的值
printf("通过整型成员读取的值: %d\n", u.num);
return 0;
}
结果解释
联合体所有成员共享同一块内存空间。在这个联合体中,myStruct
的两个short
成员共占用4个字节(假设short
是2字节),num
也是4字节。当myStruct.num1
被赋值为100,myStruct.num2
被赋值为200时,内存布局如下(假设小端序):
+-----+-----+-----+-----+
| 100 | 200 | 0 | 0 |
+-----+-----+-----+-----+
当通过num
读取时,由于num
占用4个字节,会把这4个字节按整数解析,所以值为100 + 200 * 2^16
(在小端序系统中)。
内存对齐影响
联合体的大小是其最大成员的大小,在这个例子中是int
的大小,通常为4字节。结构体myStruct
中两个short
成员总共也是4字节,满足内存对齐要求。如果myStruct
中有其他成员导致其大小超过int
,联合体大小会相应调整以满足最大成员的对齐要求。同时,在不同的系统(如大端序或小端序)中,通过num
读取的值会因为字节序不同而不同。