联合体(Union)
联合体(Union)简介
联合体(union)是 C 和 C++ 编程语言中的一种数据结构,和结构体(struct)类似,但有一些重要的区别。
定义
- 联合体中的所有成员共享同一段内存,也就是说,联合体中的多个成员变量会占用相同的地址,但是在任何一个时间点只能存储一个成员的值。
1. 联合体的定义和语法
定义语法
union UnionName {DataType member1;DataType member2;...
};
示例
union Example {int i; // 整数,占用 4 字节float f; // 浮点数,占用 4 字节char c; // 字符,占用 1 字节
};
- 这里的联合体
Example包含了 3 个成员:- 一个整数
i,占用 4 字节。 - 一个浮点数
f,占用 4 字节。 - 一个字符
c,占用 1 字节。
- 一个整数
- 存储特点:
- 联合体的总大小取决于它的最大成员所需的内存大小(这里是
4 字节,因为int和float都占 4 字节)。
- 联合体的总大小取决于它的最大成员所需的内存大小(这里是
2. 联合体的内存分配
内存共享特点
- 联合体中的所有成员都共享同一块内存,因此:
- 写入一个成员会覆盖其他成员的值。
- 在任意时刻,联合体中只能存储一个有效值。
示例
union Example {int i; // 整数,占用 4 字节float f; // 浮点数,占用 4 字节char c[4]; // 字符数组,占用 4 字节
};
union Example ex;
ex.i = 42; // 写入整数 42
printf("i: %d\n", ex.i); // 输出 i 的值:42
ex.f = 3.14; // 写入浮点数 3.14
printf("f: %.2f\n", ex.f); // 输出 f 的值:3.14
printf("i: %d\n", ex.i); // 输出 i 的值:此时 i 的值已被覆盖
输出
i: 42
f: 3.14
i: 1078523331 // i 的值被 f 的写入覆盖,解释为浮点数的二进制形式
3. 联合体的用途
3.1 内存节省
- 联合体非常适合需要节省内存的场景。
- 由于多个成员共享同一段内存,可以显著减少内存占用。
3.2 数据转换
- 联合体常用于类型转换,允许以不同的方式访问同一块数据。
示例:浮点数与二进制表示的转换
#include <stdio.h>
union FloatToBits {float f;unsigned int bits;
};
int main() {union FloatToBits data;data.f = 3.14; // 写入浮点数printf("Float: %.2f\n", data.f); // 输出浮点数printf("Bits: 0x%X\n", data.bits); // 输出二进制表示return 0;
}
输出
Float: 3.14
Bits: 0x4048F5C3
- 同一块内存可以通过
data.f访问为浮点数,通过data.bits访问为其二进制位。
4. 联合体的常见用途
4.1 数据协议处理
- 联合体常用于解析二进制数据流。例如,在通讯协议中,可以通过联合体将字节流解析为特定的数据结构。
示例:解析 16 位数据的高低字节
union Data16 {unsigned short full; // 16 位数据struct {unsigned char low; // 低字节unsigned char high; // 高字节} parts;
};
int main() {union Data16 data;data.full = 0x1234; // 写入 16 位数据printf("Full: 0x%X\n", data.full); // 输出完整值printf("High: 0x%X\n", data.parts.high); // 输出高字节printf("Low: 0x%X\n", data.parts.low); // 输出低字节return 0;
}
输出
Full: 0x1234
High: 0x12
Low: 0x34
应用场景
- 网络协议:
- 在网络通讯中,经常需要解析协议头部,例如 IP 包头、TCP 包头等,联合体可以方便地拆解字段。
- 嵌入式开发:
- 在嵌入式系统中,用联合体将字节序列解析为多字节变量(如
int或float)。
- 在嵌入式系统中,用联合体将字节序列解析为多字节变量(如
4.2 硬件寄存器操作
- 联合体可以用于操作硬件寄存器,通过联合体直接访问寄存器的特定位。
示例:32 位寄存器的分段访问
union Register {unsigned int value; // 寄存器的完整值struct {unsigned char byte0; // 第 0 字节unsigned char byte1; // 第 1 字节unsigned char byte2; // 第 2 字节unsigned char byte3; // 第 3 字节} bytes;
};
int main() {union Register reg;reg.value = 0x12345678; // 写入寄存器值printf("Byte 0: 0x%X\n", reg.bytes.byte0); // 输出低字节printf("Byte 1: 0x%X\n", reg.bytes.byte1); // 输出次低字节printf("Byte 2: 0x%X\n", reg.bytes.byte2); // 输出次高字节printf("Byte 3: 0x%X\n", reg.bytes.byte3); // 输出高字节return 0;
}
输出
Byte 0: 0x78
Byte 1: 0x56
Byte 2: 0x34
Byte 3: 0x12
5. 联合体与结构体的区别
| 特性 | 联合体(union) | 结构体(struct) |
|---|---|---|
| 内存分配 | 所有成员共享同一段内存,大小由最大成员决定 | 每个成员都有独立的内存,大小是所有成员内存之和 |
| 成员访问 | 同一时刻只能存储一个成员,访问其他成员可能导致数据不一致 | 所有成员可以同时访问,互不干扰 |
| 用途 | 内存节省,数据转换,多种数据形式的联合表示 | 表示多种属性的组合体 |
| 使用限制 | 不适合需要同时使用多个成员的场景 | 可以同时访问多个成员 |
6. 注意事项
- 数据覆盖:
- 由于所有成员共享内存,当你写入一个成员时,会覆盖其他成员的值。
- 使用联合体时要非常小心,确保对成员的访问逻辑正确。
- 对齐与大小:
- 联合体的大小由其最大成员的大小决定,并可能受到编译器对齐(padding)的影响。
- 联合体与类型安全:
- 联合体没有类型检查机制,读写不同类型的成员时可能导致不安全行为。
7. 总结
- 联合体是 C/C++ 中的一种高级数据类型,适用于节省内存、数据解析和类型转换等场景。
- 其核心特点是成员共享同一段内存,这既带来了灵活性,也对程序员提出了更高的使用要求。
- 常见用途包括:
- 数据协议解析(如解析高低字节)。
- 硬件寄存器操作。
- 浮点数与二进制位的转换。
- 节省内存空间的场景。
如有侵权,联系删除
相关文章:
联合体(Union)
联合体(Union)简介 联合体(union)是 C 和 C 编程语言中的一种数据结构,和结构体(struct)类似,但有一些重要的区别。 定义 联合体中的所有成员共享同一段内存,也就是说…...
Kibana:ES|QL 编辑器简介
作者:来自 Elastic drewdaemon ES|QL 很重要 💪 正如你可能已经听说的那样,ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了,但随着时间的推移,它将成为与 Elasticsearch 中的数据交互的最强大…...
【工具】curl工具
curl 官网: https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注: 支持SMTP(或者POP3)协议,curl的版本必须高于7.20(含&…...
idea中远程调试中配置的参数说明
Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具(如 IDEA)和远程服务之间的调试连接。当你启动远程调试时,IDEA 会监听这个配置的端口号…...
JavaWeb 前端基础 html + CSS 快速入门 | 018
今日推荐语 指望别人的救赎,势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽,我是菜鸟阿康。 今天 正式进入JavaWeb 的学习,简单学习 html CSS 这2各前端基础部分&am…...
Debian 设定 tomcat 定时重启
目录 背景 过程记录 1、编辑sh文件,完成重启功能 2、设置sh的可执行权限 编辑 3、设置定时任务 背景 在Debian 12系统中,原本部署了两个tomcat,结果总是遇到CPU飙升到影响应用正常使用的程度,找了很久原因还是没有找到。 …...
【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…...
下载文件,浏览器阻止不安全下载
背景: 在项目开发中,遇到需要下载文件的情况,文件类型可能是图片、excell表、pdf、zip等文件类型,但浏览器会阻止不安全的下载链接。 效果展示: 下载文件的两种方式: 一、根据接口的相对url,拼…...
基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境:最好是java jdk 1.8,我们在这个平台…...
【17】Word:林楚楠-供应链❗
目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为:文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式:形状轮廓…...
Transformer中基于惊喜的遗忘机制
在语言建模任务上,拥有 760M 参数的 Titans(MAC) 在 WikiText 上达到了 19.93 的困惑度,显著优于同等规模的 Transformer++(25.21) 和 Mamba2(22.94)。在常识推理任务上,Titans 在包括 PIQA、HellaSwag、WinoGrande 等 9 个基准测试中的平均准确率达到 52.51%,超过了现…...
从玩具到工业控制--51单片机的跨界传奇【3】
在科技的浩瀚宇宙中,51 单片机就像一颗独特的星辰,散发着神秘而迷人的光芒。对于无数电子爱好者而言,点亮 51 单片机上的第一颗 LED 灯,不仅仅是一次简单的操作,更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...
基于机器学习的用户健康风险分类及预测分析
完整源码项目包获取→点击文章末尾名片! 背景描述 在这个日益注重健康与体能的时代,健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息,包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...
CF 641A.Little Artem and Grasshopper(Java实现)
题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度,试问是否能够跳出这个长度(即落点位置在0或n1) 思路分析 输入n就有n个房间,n套规则(固定方向和跳跃距离),蚂蚱到哪个房间就…...
5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署
想象一下,只需简单几步操作,就能生成逼真的语音效果,无论是为客户服务还是为游戏角色配音,都能轻松实现。GPT-Sovits 模型,其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...
1.Spring AI 从入门到实践
Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...
第23篇 基于ARM A9处理器用汇编语言实现中断<五>
Q:怎样修改HPS Timer 0定时器产生的中断周期? A:在上一期实验的基础上,可以修改按键中断服务程序,实现红色LED上的计数值递增的速率,主程序和其余代码文件不用修改。 实现以下功能:按下KEY0…...
攻防世界 unseping
开启场景 整体来说是创建了一个case类,然后可接受post传来的ctf的值,并对其进行base64解码以及反序列化。所以我们能控制ctf变量。 先看__wakeup方法,该方法使用waf方法对$arg中的内容进行了防护,过滤掉了| & ; 空格 / cat f…...
Python编程与在线医疗平台数据挖掘与数据应用交互性研究
一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…...
浔川 AI 翻译已修复,可正常使用
浔川 AI 翻译已修复,可正常使用 亲爱的用户们: 大家好!经过技术团队的不懈努力,浔川 AI 翻译平台已完成修复,目前各项功能均已恢复正常,可流畅使用。在此,我们向一直以来关心和支持浔川 AI 翻译…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
