9.1 联合体 union
联合体(union)让多个成员共享同一块内存。你可以把它理解成“同一个储物格,可以按不同类型解释”,但同一时刻只有最后写入的那个成员是可靠的。
c
union Value {
int int_value;
double double_value;
char letter;
};
union Value v;
v.int_value = 42; // 现在应该读取 int_value
v.double_value = 3.14; // 覆盖同一块内存,int_value 不再可靠联合体的大小通常等于最大成员的大小,因为所有成员从同一个地址开始。结构体会让每个成员各占自己的位置,下一节会学习这种写法。
用标签记录当前类型
union 自己不会记住“现在保存的是哪一种成员”。常见做法是用 enum 保存一个标签:
c
enum ValueKind { VALUE_INT, VALUE_DOUBLE };
enum ValueKind kind = VALUE_INT;
union Value v;
v.int_value = 42;
if (kind == VALUE_INT) {
printf("%d\n", v.int_value);
}标签和联合体要一起更新。否则程序可能把同一段内存按错误类型读取,得到没有意义的结果。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...