联合体
联合体(union)是一种特殊的数据类型,所有成员共享同一块内存。联合体的大小等于最大成员的大小,同一时刻只能有效使用一个成员。联合体常用于节省内存、实现类型双关等场景。
基本定义
union Data {
int i;
float f;
char str[20];
};
union Data d;
d.i = 10; /* 使用整型成员 */
printf("%d\n", d.i); /* 10 */
d.f = 3.14; /* 现在使用浮点成员 */
printf("%f\n", d.f); /* 3.14 */
/* d.i 的值现在不确定 */
大小
union Data d;
printf("%zu\n", sizeof(d)); /* 20:最大成员 char[20] */
初始化
/* 初始化第一个成员 */
union Data d1 = {10}; /* d.i = 10 */
/* C99 指定初始化 */
union Data d2 = {.f = 3.14}; /* d.f = 3.14 */
匿名联合体(C11,部分 C99 扩展)
struct Variant {
int type;
union { /* 匿名联合体 */
int i;
float f;
char *s;
}; /* 成员直接属于 struct */
};
struct Variant v;
v.type = 1;
v.i = 10; /* 直接访问 */
常见错误
同时访问多个成员:
union Data d;
d.i = 10;
printf("%f\n", d.f); /* 未定义行为:按 float 解释 int 的位模式 */
大小假设:
union Data d;
/* 假设 sizeof(d) == sizeof(int) */
/* 错误:实际是 sizeof(char[20]) */
最佳实践
- 用标记区分当前有效的成员
- 不要同时读取不同成员
- 用指定初始化器明确初始化哪个成员
- 匿名联合体简化嵌套访问