当前位置: 首页 > news >正文

联合体union的基本用法

引言

联合体(union)是 C/C++ 中一种特殊的复合数据类型,它允许不同类型的成员共享同一块内存空间,主要用于在有限内存中存储 “互斥使用” 的数据。

一、基本用法

1.1 定义与声明

使用 union 关键字定义联合体,语法与结构体类似,但成员共享内存。

// 定义联合体(存储不同类型的数值,但同一时间仅一种有效)
union Data 
{int i;       // 整数float f;     // 浮点数char c;      // 字符
};
// 声明联合体变量
union Data d1;  // 方式1:完整声明
Data d2;        // 方式2:结合typedef取别名(更简洁)//结合 typedef 取别名(推荐):
typedef union 
{int i;float f;char c;
} Data;Data d;  // 直接用别名声明,无需重复写union

1.2 成员访问

通过 . 操作符访问成员,与结构体用法一致;若为指针,则用 -> 操作符。

#include <stdio.h>typedef union 
{int i;float f;char c;
} Data;int main() 
{Data d;// 赋值整数成员d.i = 100;printf("d.i = %d\n", d.i);  // 输出 100// 此时访问其他成员会得到乱码(内存被覆盖)printf("d.f = %f\n", d.f);  // 输出无意义值(如 0.000000 或随机数)// 赋值浮点数成员(覆盖整数的内存)d.f = 3.14f;printf("d.f = %f\n", d.f);  // 输出 3.140000printf("d.i = %d\n", d.i);  // 输出浮点数3.14的二进制对应的整数值(乱码)return 0;
}

1.3 内存特性

  • 所有成员共享同一块内存,起始地址相同。
  • 联合体的大小 = 最大成员的大小(确保能容纳所有成员中最大的那个)。

二、应用场景

2.1 解析二进制数据(内存共用)

例如解析一个 4 字节的二进制数据,既可视为整数,也可视为浮点数:

// 4字节二进制数据,可按int或float解析
typedef union 
{int i;float f;char bytes[4];  // 按字节访问
} BinaryData;int main() 
{BinaryData data;data.i = 0x41480000;  // 二进制值printf("作为整数:%d\n", data.i);       // 输出 1094060032printf("作为浮点数:%f\n", data.f);     // 输出 12.5(0x41480000对应float的12.5)printf("字节1:%02X\n", data.bytes[0]); // 输出 00(小端存储)return 0;
}

三、注意事项(避坑关键点)

3.1 成员互斥,赋值会覆盖

写入一个成员会覆盖其他成员的内存,读取未被赋值的成员会得到无意义的 “脏数据”。
解决:始终用一个 “类型标记”(如枚举)记录当前有效的成员类型(见场景 1 示例)。

3.2 内存对齐规则

联合体的大小由最大成员决定,但需满足最大成员的对齐要求:

union Align 
{char c;       // 1字节(对齐要求1)double d;     // 8字节(对齐要求8)
};
printf("联合体大小:%lu\n", sizeof(union Align)); // 输出8字节(满足double的对齐)
http://www.gsyq.cn/news/12612.html

相关文章:

  • 9.27 git与pycharm
  • TDS文件搜索_Winform版本与avalonia开发差异比较:(一)系统消息的接收与无标题栏/边框窗体的移动与尺寸调整
  • 【SimpleFOC】SimpleFOC的运动规划器(Motion Planner)和梯形速度规划
  • “计算理论之美”课程笔记四:高维空间组合优化
  • 4gl
  • 926
  • 免费领夸克盘1tb
  • sql优化个人总结
  • Powershell 入门
  • US$100 Free Activation VVDI2 Copy 48 Transponder by OBDII Function Authorization Service
  • 题解:P13523 [KOI 2025 #2] 序列与查询
  • 实用指南:(14)ASP.NET Core2.2 中的日志记录
  • 论文笔记:How Can Recommender Systems Benefit from Large Language Models: A Survey - 详解
  • newDay04
  • day005
  • 软工9.26
  • 告别照相馆!这些小软件让你轻松搞定证件照!
  • Ext-js-即时入门-全-
  • 基于大数据的水产品安全信息可视化分析框架【Hadoop、spark、可视化大屏、课程毕设、毕业选题、数据分析、资料爬取、数据可视化】
  • 什么?就是算法面试(5)------NMS(非极大值抑制)原理 Soft-NMS、DIoU-NMS
  • CSS值
  • 2025_Polar秋季赛_web全解
  • 本地调试接口时遇到的跨域问题,十分钟解决
  • CF1995D Cases
  • 《etcd库——键值存储系统》 - 教程
  • 深度学习周报(9.15~9.21) - 实践
  • 2025.9.26总结 - A
  • 深入解析:盟接之桥EDI软件:中国制造全球化进程中的连接挑战与路径探索
  • 搜维尔科技:Force Dimension Omega力反馈设备遥操作工业机器人
  • C++程序练习(部分未完全完成)