C语言联合体(Union)——让同一块内存“变脸”

📅 2026/7/13 0:21:07
C语言联合体(Union)——让同一块内存“变脸”
什么是联合体联合体是一种特殊的数据类型它让多个成员共享同一块内存空间。就像一间“变形房间”——你可以把它当作卧室也可以当作书房但同一时间只能有一种用途。union Data { int i; float f; char str[20]; };这里 i、f、str 从同一个地址开始存储大小取决于最大的成员此处为 str[20]占20字节。联合体 vs 结构体核心区别对比项结构体 (struct)联合体 (union)内存分配每个成员独立分配所有成员共享一块内存总大小各成员大小之和对齐最大成员的大小使用方式可同时存储多个值同一时刻只能存一个有效值典型场景组合不同属性如学生信息节省内存或“多态”解析二进制数据举个例子结构体像抽屉柜每个抽屉放不同东西互不干扰。联合体像百变工具箱每次只能放一种工具放扳手时锤子就不存在了。实际用法示例1. 节省内存嵌入式常用union Packet { int intVal; float floatVal; char byteArr[4]; }; // 大小只有4字节而不是 444122. 类型双关解析不同格式union Number { int n; float f; }; union Number num; num.f 3.14; printf(整数形式%d\n, num.n); // 输出浮点数的二进制对应的整数值3. 搭配结构体实现“带标签的联合体”安全用法struct Variant { int type; // 0:int, 1:float, 2:string union { int i; float f; char s[20]; } data; }; // 通过 type 标记当前存储的是哪种类型避免误读注意事项坑点赋值会覆盖——修改一个成员其他成员的值随之改变因为它们共用内存。读取未赋值的成员是未定义行为得到的是垃圾数据。大小按最大成员对齐不是简单的相加。不能直接比较两个联合体标准未定义按成员逐个比。什么时候用联合体内存极度受限如单片机、协议栈。需要将同一块数据“翻译”成不同视图如网络字节序转换。实现变体类型配合枚举或结构体标记。一句话总结联合体 一块内存多种解释节省空间但小心覆盖。理解它你的C语言工具箱又添一把利器如果你觉得有帮助欢迎点赞、收藏、评论让更多人看到