在 C 语言中,共用体(Union) 是一种数据结构,它允许不同的数据类型存储在同一块内存区域中。与结构体不同的是,共用体的所有成员共享相同的内存空间,因此它们的大小等于最大成员的大小,而结构体的大小是所有成员大小之和。
1. C 共用体的定义
共用体的定义格式如下:
union UnionName {
dataType member1;
dataType member2;
...
};
其中,UnionName 是共用体的名称,member1, member2 等是共用体的成员,每个成员的数据类型 dataType 可以不同。
2. 共用体的特性
内存共享:共用体的所有成员共享同一块内存,只有一个成员可以在某一时刻存储有效数据。
大小:共用体的大小等于其最大成员的大小,因为它会根据最大成员的大小来分配内存。
3. 共用体的例子
#include
// 定义一个共用体
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. 共用体的应用场景
硬件接口:例如,处理不同数据类型的硬件寄存器,可以用共用体来映射硬件的不同视图。
协议解析:处理不同格式的协议数据时,可以用共用体来存储数据包中的不同字段。
类型转换:通过共用体共享内存,可以实现从一种数据类型到另一种数据类型的转换。
8. 参考资料
C共用体(Union) – 菜鸟教程
ISO C Standard – Union