欢迎光临
我们一直在努力

C语言联合体(union)超详细讲解+对比结构体+实战应用

前言:

在 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 语言代码!

    后记:

    如果你是准备面试、嵌入式开发、网络编程方向,联合体几乎必问。建议把本文的对比表格、大小端代码、大小计算多看几遍。

    赞(0)
    未经允许不得转载:171主机测评 » C语言联合体(union)超详细讲解+对比结构体+实战应用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址