联合体union的基本用法

news/2025/9/27 0:43:22/文章来源:https://www.cnblogs.com/happykino/p/19114604

引言

联合体(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.mzph.cn/news/918951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

US$30.4 BMW-CAS4 Interface Board for Yanhua Mini ACDP Module1

BMW-CAS4 Interface Board for Yanhua Mini ACDP Module1Promotion: Use [ACDP] as coupon code for 7% Off. Kindly note this coupon can only work on Yanhua ACDP Series.BMW-CAS4 Interface board, applicable to…

个人网站设计目的e4a怎么做网站app

本文主体内容译于[DPDK社区文档]&#xff0c;但并没有逐字翻译&#xff0c;在原文的基础上进行了一些调整&#xff0c;增加了对TSS分类器的详细阐述。 1. 概览 本文描述了OVSDPDK中的包分类器(datapath classifier -- aka dpcls)的设计与实现思路。本文的内容主要牵涉到分类器对…

网站编程多少钱校园网站建设规划书

CSDN博主 单片机 毕业设计 物联网 嵌入式

弱结构光三维扫描重建

在视觉三维重建中,要获取稠密的三维点云,通常采用面结构光来实现。但是作为普通的开发者,昂贵的工业相机、投影仪、工装等设备令人望而却步。如何利用手上常见的设备,实现稠密点云重建呢?早在 1998 年,Jean-Yves…

9.27 git与pycharm

今日学习内容:pycharm与git管理 在pycharm中可以用git对代码进行基础的管理今日bug 连不上github,可能是代理的原因 fatal: unable to access https://github.com/Shoiger/Alice.git/: Unsupported proxy syntax in …

淘宝客的优惠卷网站怎么做的电脑浏览器打不开是怎么回事

这篇教程主要内容展示如何利用Core Graphics Framework画圆圈,当用户点击屏幕时随机生成不同大小的圆,这篇教程在Xcode6和iOS8下编译通过。 打开Xcode,新建项目选择Single View Application,Product Name填写iOS8SwiftDrawingCirclesTutorial,Organization Name和Organization …

用前端框架做自适应网站杭州住房和城乡建设部网站

NIC注册和注销的通用架构Linux系统中NIC网络设备驱动程序利用网络代码进行注册和注销有其通用的架构&#xff0c;这里以PCI Ethernet NIC为例&#xff0c;其他设备类型只是所以函数名称和调用方式不同&#xff0c;主要依据于设备总线提供的接口。其中(a)为设备注册的大致流程图…

TDS文件搜索_Winform版本与avalonia开发差异比较:(一)系统消息的接收与无标题栏/边框窗体的移动与尺寸调整

TDS文件搜索_Winform版本与avalonia开发差异比较:(一)系统消息的接收与无标题栏/边框窗体的移动与尺寸调整一、Winform和Avalonia的选择 收到私信,有看过上一篇的朋友说想了解Winform相关内容,感谢建议,因为因此…

台州网站制作维护规范门户网站的建设和管理办法

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;读取不到数据&#xff0c;show databases;查看数据库报错 2&#xff09;重启docker服务&#xff0c;服务启动失败&#xff0c;查看日志报错如下图所示 3&#xff09;报错信息&#xff1a;chmod /data/docker: read-only…

宜昌做网站优化万网ip查询

一、 在终端输入 sudo apt-get install openssh-server 二、 执行如下命令 sudo apt-get install ssh 三、 开启 ssh-server&#xff0c;输入密码 service ssh start 四、 验证&#xff0c;输入 ps -e|grep ssh&#xff0c;看到sshd成功 ps -e|grep ssh五、 连接

手机版网站开发网站运行时错误如何做

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围&#xff0c;这种处理 对于强调感兴趣灰度区非常有用…

wordpress 站标不显示wordpress 手机登陆

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…

学做彩票网站win7 iis 默认网站

​​​​​​ 与存储标量数据(如整数、字符串等)的传统数据库不同,矢量数据库旨在有效地存储和检索矢量数据——表示多维空间中的点的数值集合。 本文将探讨如何在 Rust 中实现基本的向量数据库。 让我们开始吧!🦀 什么是矢量数据库? 矢量数据库是一种针对存储和查询…

单人网站制作关键词搜索站长工具

PHP 做网页后端还是很优秀的&#xff0c;PHP 表单提交&#xff0c;不外乎两种方法&#xff0c;即 GET 和 POST 方法&#xff1b;PHP后台使用全局变量$_POST;$_GET;来获取提交数据。代码&#xff1a;<!DOCTYPE HTML> <html> <head><meta charset"utf-…

梦织网站如何用wordpress快速建站

使用 fake-as 可以将本地真实的 AS 编号隐藏&#xff0c;其他 AS 内的对等体在指定本端对等体所在的AS 编号时&#xff0c;应该设置成这个伪AS 编号。 这是实验拓扑&#xff0c;IBGP EBGP 邻居都使用物理接口来建立 基本配置&#xff1a; R1: sys sysname R1 int loo0 ip add…

js源码下载从哪个网站能下载建设部门户网站条例免费下载

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

网站更新前知道内容岳阳网站平台设计

文章目录 前言SMTPPOP3IMAP4区别与联系 前言 常见的邮件协议包括SMTP、POP3和IMAP4。这些协议都隶属于TCP/IP协议簇&#xff0c;属于应用层&#xff0c;分别通过TCP端口25、110和143建立连接。电子邮件的发送和接收过程依赖于这些协议。 SMTP &#xff08;Simple Mail Trans…

东莞seo网站优化方式深圳网站快速备案

关于类似的帖子好像很多&#xff0c;但是没有找到具体能帮我解决问题的办法。还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点&#xff1a; 先放一个图&#xff1a; A&#xff0c;先说说不用xpath的场景&#xff0c;一般是用于存在id或者name。可能没有看到na…

网站开发是先做前段还是后台简单电子商务网站建设

大家好&#xff0c;我是专注家居和装修知识分享的家居杂坛。喜欢的就点击一下关注吧&#xff01;对于在地面上所浇筑的混凝土&#xff0c;常规有两种做法。例如&#xff0c;在混凝土中铺设钢筋&#xff0c;打成钢筋混凝土的地面&#xff0c;又或者还有一些朋友在钢混凝土中放入…

php网站开发作业网站中高端建设

1、hibernate 要求实体类里面有一个属性作为唯一值&#xff0c;对应的表字段是主键&#xff0c;主键可以不同的生成策略 2、hibernate 主键生成策略有很多的值 <generator class"native"></generator> 3、在class属性里面有很多值 &#xff08;1&#xf…