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

union 的定义和基本结构以及用途

在 C 语言中,union(联合体) 是一种数据结构,它允许多个成员共享相同的内存空间。换句话说,联合体中的所有成员都存储在同一块内存区域,不同的成员会占用相同的内存地址,但在同一时刻只能保存一个成员的值。

1. union 的定义和基本结构

定义 union 的语法与 struct 类似,但在 union 中,所有成员共享同一块内存区域,而在 struct 中,每个成员都有自己独立的内存空间。

union Data {int i;float f;char str[20];
};

这个 union Data 包含三个成员:i(整型)、f(浮点型)、str(字符数组)。在内存中,ifstr 是共享同一块存储空间的,因此它们不能同时保存值。

2. union 的内存分配

union 中,分配的内存大小等于最大成员的大小。例如:

union Data {int i;        // 占 4 字节float f;      // 占 4 字节char str[20]; // 占 20 字节
};
  • 联合体 Data 的大小是 20 字节(str[20] 是最大的成员),所有成员都共享这 20 字节的内存。

3. 如何使用 union

你可以像结构体一样定义和访问 union 的成员。注意,一次只能使用一个成员,并且最后存入的值会覆盖之前的值。

#include <stdio.h>
#include <string.h>union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("data.i : %d\n", data.i);data.f = 220.5;printf("data.f : %f\n", data.f);strcpy(data.str, "Hello");printf("data.str : %s\n", data.str);return 0;
}

在这段代码中,data.i 最先被赋值为 10,然后 data.f 被赋值为 220.5,最后 data.str 被赋值为 "Hello"。注意,当 str 被赋值后,之前的 if 的值都被覆盖。

4. union 的用途

union 通常用于节省内存,尤其在硬件编程或底层系统开发中,常用于处理以下场景:

4.1 节省内存

如果你有多个数据类型,但这些类型不会同时使用,可以通过 union 节省内存。例如在嵌入式系统中,数据存储空间非常有限,你可以使用 union 存储多种不同的类型。

4.2 数据类型的重解释

union 允许你以不同的方式解释相同的内存。这在需要对数据进行不同类型的访问时非常有用。

例如,当你想通过字节数组访问一个整数的字节内容时,可以使用 union

union IntByte {int i;unsigned char bytes[4];
};int main() {union IntByte data;data.i = 0x12345678;printf("Bytes: %x %x %x %x\n", data.bytes[0], data.bytes[1], data.bytes[2], data.bytes[3]);return 0;
}

这段代码允许你查看整数 0x12345678 在内存中的字节表示。

4.3 硬件寄存器访问

在嵌入式系统中,经常需要访问硬件寄存器,寄存器通常可以用 union 来表示。硬件寄存器有时既可以按位访问,也可以按字节或整块访问,使用 union 可以同时处理这些不同的访问方式。

例如:

union Register {uint32_t full;struct {uint8_t byte1;uint8_t byte2;uint8_t byte3;uint8_t byte4;};
};

这段代码允许你通过 full 访问整个 32 位寄存器,也可以分别访问每个 8 位字节。

4.4 变体数据结构

在一些协议栈或者文件格式中,你可能需要存储多种类型的数据,但在一次操作中只使用其中一种。例如,一个网络协议包可能包含多个不同类型的字段,你可以使用 union 来表示这些字段,从而在解析时节省内存。

5. union 的局限性

  • 同时只能存储一个值:联合体中的所有成员共享相同的内存空间,因此在任一时刻只能存储一个成员的值。如果你想同时使用多个值,就需要考虑使用 struct
  • 调试复杂性:由于不同的成员共享同一片内存,因此调试时可能不容易区分哪个成员当前有效。

6. 总结

union 是一种允许多个成员共享同一块内存的结构体,常用于节省内存或需要以不同方式解释相同内存时。它在嵌入式系统、硬件编程和数据解析方面非常有用,但要注意它一次只能保存一个有效的值,并且在使用中需要小心,以防止未定义的行为。

相关文章:

union 的定义和基本结构以及用途

在 C 语言中&#xff0c;union&#xff08;联合体&#xff09; 是一种数据结构&#xff0c;它允许多个成员共享相同的内存空间。换句话说&#xff0c;联合体中的所有成员都存储在同一块内存区域&#xff0c;不同的成员会占用相同的内存地址&#xff0c;但在同一时刻只能保存一个…...

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例&#xff1a;多变量系统的混合整数规划 表格总结&#xff1a;混合整数规划的求解方法与适用场景 结论 引言 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xf…...

【数据结构】6——图1,概念

数据结构6——图1&#xff0c;概念 文章目录 数据结构6——图1&#xff0c;概念基本概念图的分类图的表示方法 基本概念 由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成的集合。顶点表示图中的点&#xff0c;而边表示顶点之间的连接。记为 G …...

技术周总结 09.09~09.15周日(C# WinForm WPF)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…...

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…...

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun&#xff0c;它的功能是:除了字符串前导的*号之外&#xff0c;将串中其它*号全部删除。在编写函数时&#xff0c;不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如&#xff0c;字符串中的内容为:-**…...

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …...

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错

文章标题 问题描述原因分析解决方案参考资料 问题描述 最近&#xff0c;笔者在SpringBoot3项目中整合Druid连接池时&#xff0c;偶然翻到一条介绍Druid监控的短视频&#xff0c;兴致盎然之下尝试设置了一下Druid监控。 But&#xff0c;按照视频中提供的yml参数对照设置&#x…...

【算法】滑动窗口—找所有字母异位词

“找到字符串中所有字母异位词”的难度为Medium&#xff0c;看一下题目&#xff1a; 给定一个字符串 S 和一个非空字符串 T&#xff0c;找到 S 中所有是 T 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 所谓的字母异位词&#xff0c;其实就是全排列&#xff0c;原题…...

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…...

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…...

Qt与MQTT交互通信

MQTT全称是&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议 是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&#xff0c;常用于互联网中&am…...

dd 命令:复制和转换文件

一、dd 命令简介 ​dd​ 命令是一个在 Unix 和类 Unix 系统中用于复制文件和转换文件的命令行工具。它的功能非常强大&#xff0c;可以用于各种目的&#xff0c;例如创建镜像文件、备份和恢复数据、复制数据等。 ​dd​ 是一个用于读取、转换和写入数据的工具&#xff0c;通常…...

文件系统(磁盘 磁盘文件 inode)

文章目录 磁盘看看物理磁盘磁盘的存储结构 对磁盘的储存进行逻辑抽象inode号文件名 -> inode判断文件在哪个分区 磁盘 电脑中存在非常多的文件&#xff0c;被打开的文件只是少量的。 没有被打开的文件&#xff0c;在磁盘中放着&#xff0c;那么文件是如何存取&#xff1f; …...

ThreeJs创建圆环

ThreeJs除了创建基本的长方体&#xff0c;球形&#xff0c;圆柱等几何体&#xff0c;也可以创建一些特殊的几何体&#xff0c;比如圆环&#xff0c;多边体&#xff0c;这节就来讲怎么用Threejs绘制出圆环。首先依然是要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&a…...

React实现类似Vue的路由监听Hook

React实现类似Vue的路由监听Hook 监听路由变化&#xff1b;React Hook封装&#xff0c;返回回调函数&#xff0c;新旧路由为函数参数&#xff1b; 代码 import { useEffect, useRef } from react; import { useHistory, useLocation } from react-router-dom;/*** 监听路由变…...

Visual Studio打开项目的一些小技巧

Visual Studio(VS)是一款功能强大的集成开发环境&#xff0c;许多刚入门C/C的小白也会使用这款软件进行写代码&#xff0c;然而它的操作并不简单&#xff0c;下面将讲解一下VS打开项目文件的一些小技巧。 目录 &#x1f381;创建空项目 ❤️①点击“创建新项目” ❤️②点击“…...

前端页面中使用 ppt 功能,并且可以随意插入关键帧

要在前端页面中实现类似 PowerPoint 的功能&#xff0c;并且能够随意插入和控制关键帧动画&#xff0c;你可以使用 HTML、CSS 和 JavaScript 结合的方式来创建一个互动幻灯片系统。以下是一个详细的实现方案&#xff0c;包括如何插入和控制关键帧动画&#xff1a; 1. 基础 HTM…...

机器学习:opencv--图像金字塔

目录 一、图像金字塔 1.图像金字塔是什么&#xff1f; 2.有哪些常见类型&#xff1f; 3.金字塔的构建过程 4.图像金字塔的作用 二、图像金字塔中的操作 1.向下采样 2.向上采样 3.注意--无法复原 三、代码实现 1.高斯金字塔向下采样 2.高斯金字塔向上采样 3.无法复…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...