C 语言共用体(Union)
在 C 语言中,共用体(Union) 是一种数据结构,它允许不同的数据类型存储在同一块内存区域中。与结构体不同的是,共用体的所有成员共享相同的内存空间,因此它们的大小等于最大成员的大小,而结构体的大小是所有成员大小之和。
1. C 共用体的定义
共用体的定义格式如下:
union UnionName {
dataType member1;
dataType member2;
...
};
其中,UnionName 是共用体的名称,member1, member2 等是共用体的成员,每个成员的数据类型 dataType 可以不同。
2. 共用体的特性
- 内存共享:共用体的所有成员共享同一块内存,只有一个成员可以在某一时刻存储有效数据。
- 大小:共用体的大小等于其最大成员的大小,因为它会根据最大成员的大小来分配内存。
3. 共用体的例子
#include <stdio.h>
// 定义一个共用体
union Data {
int i;
float f;
char str[20];
};
int main() {
// 创建共用体变量
union Data data;
// 给 int 类型成员赋值
data.i = 42;
printf("data.i = %d\n", data.i);
// 给 float 类型成员赋值
data.f = 3.14;
printf("data.f = %.2f\n", data.f);
// 给字符串成员赋值
snprintf(data.str, sizeof(data.str), "Hello, Union!");
printf("data.str = %s\n", data.str);
// 注意:数据覆盖问题
printf("\nAfter assigning string to data.str:\n");
printf("data.i = %d\n", data.i); // 数据已被覆盖
printf("data.f = %.2f\n", data.f); // 数据已被覆盖
return 0;
}
输出:
data.i = 42
data.f = 3.14
data.str = Hello, Union!
After assigning string to data.str:
data.i = 1737326032
data.f = 1.000000
4. 关键点
- 在上面的例子中,
data.i,data.f,data.str都占用相同的内存地址。当一个成员赋值时,它会覆盖其他成员的数据。 - 共用体的大小为最大成员的大小。在这个例子中,
str是最大的成员(20 字节),因此union Data的大小是 20 字节。
5. 使用共用体的场景
- 节省内存:如果你需要多个数据类型,但在任何时刻只使用一个数据类型,可以使用共用体来节省内存。
- 类型转换:共用体有时用于类型转换,特别是在处理二进制数据或与硬件接口时。
6. 共用体与结构体的比较
| 特性 | 共用体(Union) | 结构体(Struct) |
|---|---|---|
| 内存分配 | 所有成员共享相同的内存空间 | 每个成员占据独立的内存空间 |
| 大小 | 等于最大成员的大小 | 所有成员的大小之和 |
| 使用情况 | 当需要节省内存,且只有一个成员在某一时刻使用 | 当需要同时存储多个不同类型的数据时 |
7. 共用体的应用场景
- 硬件接口:例如,处理不同数据类型的硬件寄存器,可以用共用体来映射硬件的不同视图。
- 协议解析:处理不同格式的协议数据时,可以用共用体来存储数据包中的不同字段。
- 类型转换:通过共用体共享内存,可以实现从一种数据类型到另一种数据类型的转换。