前言:
在 C 语言底层开发、嵌入式、网络协议、内存优化场景中,联合体(union / 共用体)是一个非常重要且高频使用的语法特性。很多同学容易把它和结构体混淆,也不清楚它到底有什么用、内存怎么布局、面试怎么考。
本篇文章带你从定义、内存原理、与结构体对比、大小计算、大小端判断、实战用法全方位吃透联合体。
一、联合体(union)基本概念
1.1 什么是联合体
联合体(union),也叫共用体,是 C 语言提供的一种构造数据类型。
它的核心特征只有一句话:
联合体内部所有成员,共享同一块内存空间,同一时刻只能保存一个成员的值。
也就是说:
-
给 A 成员赋值,就会覆盖 B、C 成员原来的数据
-
所有成员的起始地址完全相同
-
联合体的大小 = 最大成员的大小(考虑内存对齐)
1.2 联合体定义语法

示例:

1.3 联合体变量定义与访问

二、联合体 VS 结构体(超清晰对比)
这是面试必考,也是最容易搞混的地方。
2.1 核心对比表格(紧凑版)
表格

2.2 一句话总结区别
-
结构体:大家各住各的房间,互不干扰,同时住人。
-
联合体:大家共用一个房间,轮流住,只能住一个。
2.3 代码直观对比

大小:
-
struct:8 字节(内存对齐)
-
union:4 字节(等于最大成员 int)
内存:
-
struct:a 占 4 字节,b 占 1 字节,独立存放
-
union:a 和 b 从同一个地址开始存放
三、联合体内存布局与大小计算(超详细)
3.1 内存布局规则
所有成员起始地址相同
赋值会覆盖同一块内存
只有最后一次赋值的成员是合法有效的
3.2 联合体大小计算规则
联合体大小 至少 = 最大成员的大小
必须是最大对齐数的整数倍(遵循内存对齐)
看例子:

最大成员是 double(8),对齐数 8,所以 union 大小 = 8 字节。
再看一个:

-
最大成员:5 字节
-
对齐数:4(int)
-
最终大小:8 字节(向上取 4 的整数倍)
四、联合体的三大经典用法
用法 1:判断系统大小端(面试封神用法)
利用联合体共享内存的特点,直接读取低地址字节判断大小端。

用法 2:节省内存(嵌入式/设备开发)
当一组数据只会出现一种类型时,用联合体巨省内存。

优势: 本来需要存 int+float+char[20],现在只存最大的一份。
用法 3:类型双关(Type Punning)
把一段内存按不同类型解释,常用于网络协议、数据解析。

可以直接查看一个 int 的每一个字节。
五、联合体使用注意事项(避坑指南)
不要读取未赋值的成员
谁最后赋值,读谁,读其他成员结果是错误的。
不要在联合体中存放复杂对象
C++ 中不建议放带构造/析构的对象。
必须考虑内存对齐
联合体大小不一定等于最大成员,要看对齐规则。
建议搭配类型标签使用
用一个变量标记当前哪个成员有效,避免出错。
六、总结
union = 共用内存,所有成员共享同一块空间
struct = 独立内存,各存各的
联合体大小 = 最大成员大小 + 内存对齐
核心用途:节省内存、大小端判断、协议解析、类型双关
面试高频:大小计算、struct 与 union 区别、大小端实现
掌握联合体,你就能写出更底层、高效、省内存的 C 语言代码!
后记:
如果你是准备面试、嵌入式开发、网络编程方向,联合体几乎必问。建议把本文的对比表格、大小端代码、大小计算多看几遍。




