C语言----联合体

news/发布时间2024/9/20 6:04:10

        不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊,大家可以想象结构体是一栋楼,里面有很多房间,住了形形色色的住户(不用或者相同的数据)。但联合体只有一个房间,所有的住户都挤在这个房间里面。但是这个房间的大小是以最大数据类型来决定的。比如说我们创建了一个联合体,里面放置了int类型和char类型。那么这个联合体大小计算int类型的大小了。

联合体声明

        上面我们也说过了,联合体与结构体一样都是多个成员构成的,这些成员可以不同的型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
以联合体也叫:共⽤体。但是给联合体最大⼀个成员赋值,那么联合体会至少将最大的成员赋值处理,有多余空间在处理其他的成员,这也是与结构体的一个区别。那么大家看一下下面的照片,就知道

       大家看到了吧,联合体是用union+名字。联合体的内容与结构体是一样写的。然后联合体的初始化与结构体也是一样的。但是结构体是给内容分别赋值的。但联合体是定义一个全部都定义的了。 当然在创建联合体的时候可以同时定义。当然我们也可以像结构体一样省略联合体名:

       但是嘞,省略联合体名虽然看起来更加简洁了,但是因为没有了名字,后面就不能用该联合体定义新的变量。然后我们使用typedf将联合体改个名字如:

       使用看了上面的资料大家应该差不多了解了,联合体声明方法了吧。

验证联合体的特点

       大家知道,我在上面写了联合体是将所有的类型装在一个房子里面,并且会保证联合体最大的大小。那么我们看下面的两个代码。首先我们来确定所以类型是住在最大的那个房间里面的(就是类型最大的空间)

         这样大家可以看到打印的地址都是一样的。那么接下来验证这个房间是最大的那个类型:

      这里大家可以看到,我们明明是先个i赋的0x11223344。然后给c赋的0x55.然后我们打印i确实0x11223355。这就是联合体的另外一个特点。最少会保证最大联合体成员,然后有空间再处理其他的。那我们看一个示意图来辅助理解

联合体与结构体内存对比

        当然我们看了联合体内存分布那么我们直接与结构体内存分布对比,这样的话,可以加深我们对两种结构体的内存分布的印象。我们都将两种初始化且赋为0。

        计算联合体的大小

         我们在前面说过联合体与结构体有差异,但也有相同之处。如也可以使用#pragma pack(value) ,来修改对齐数。但当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,它的计算规则是:联合体中最大成员所占内存的大小且必须为最大类型所占字节的最小倍数。举例如下:

      首先我们看第一个联合体。我们创建的联合体成员中char a[5]是最大的那么应该首先是5个字节,但是因为int类型是4个字节那么5不是4的倍数,并且5超过4了,那么只有8是复合计算规则的,使用计算的第一个联合体大小是8。

      第二个代码,我们可以看到short数组有7的元素,那么就是14个字节。但是int是4个字节呀。4>2,并且14最接近且大于14的41的倍数,只有16了。那么第二个联合体的大小就是16了。这样普通的联合体大小大家应该就可以计算了吧。

    接下来我我们看一下结构体嵌套联合体的大小是如何计算的。当然结构体嵌套联合体计算大小肯定也是有计算规则的,毕竟无规矩不成方圆嘛。那么嵌套的话规则是什么样的嘞:它的计算规则是,联合体按照最大成员所占字节且为最大数据类型所对应的字节的最小整数倍的原则进行计算,它所占的字节数与结构体中其他成员所占字节的总和应为结构体中最大数据类型所对应的字节的最小倍数。那我们如何理解嘞,我们来看一下下面的代码:

 

       先计算联合体中,最大char a[10]占10字节,但又要为8的最小倍数,因此联合体占16字节。
然后结构体中其余5+4+8=17 字节,不是结构体中最大数据类型 double 所对应的字节数 8的最小倍数,补齐到24字节。所以,综合起来整个结构体大小:16(联合体所占字节)+ 24字节=40字节。

      那当我们定义了对其数的话会稍微改变一点:

        联合体最大占10字节,且为2的最小倍数,因此联合体占10字节,然后10+5+4+8=27字节,但不是 2的最小倍数,因此如需满足上述规则,该结构体的大小应为:10(联合体所占字节) +5+1(空字节)+4+8=28 字节。

联合体使用举例

        大家看到上面后,可能会想,讲这么多,联合体的实际使用方法来个呗,我也好有个心理预期。将来联合体怎么用。那好我们就来个比较简单的联合体使用方法。大家还记得我们前段时间讲过的大小端问题嘛。并且看了上面的知识后我们知道,联合体的存储是优先最大的。那么如果我给最大的赋值1,然后打印最大,那么如果是0这就是大端,如果是1的话那么就是小端了。

      这样大家应该清楚利用联合体来计算我们需要的数据了吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/RPGj/9572.shtml

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

相关文章

UDP 与 TCP 的区别是什么?

目录 区别 一、面向无连接 二、不可靠性 三、高效 四、传输方式 五、适用场景 1.直播 2.英雄联盟 六、总结 区别 首先 UDP 协议是面向无连接的,也就是说不需要在正式传递数据之前先连接起双方。然后 UDP 协议只是数据报文的搬运工,不保证有序且…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中,不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说,频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题,百度自动更新文章SEO工具应运而生,它能够帮助网站管…

OD(13)之Mermaid饼图和象限图

OD(13)之Mermaid饼图和象限图使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍‌⁡…

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

uniapp问卷调查(单选)

前言 该代码片段只支持问卷调查的单选功能 使用组件库 配置 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 代码 <template> <view> <view v-for"(item, index) in radiolist1" :key"index"> …

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台&#xff0c; 打通了HarmonyOS云侧与端侧能力&#xff0c;能够轻松实现HMS Core、AGC Serverless能力调用。其中&#xff0c;数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时&#xff0c;可以使用…

MWC 2024丨Smart Health搭载高通Aware平台—美格发布智能健康看护解决方案,开启健康管理新体验

2月29日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;全球领先的无线通信模组及解决方案提供商——美格智能正式发布了新一代Cat.1模组SLM336Q&#xff0c;是中低速物联网应用场景的高性价比之选。本次还发布了首款搭载高通Aware™平台的智能看护解决方案MC303&#x…

element-ui附件上传及在线查看详细总结,后续赋源码

一、附件上传 1、在element-ui上面复制相应代码 a、accept"image/*,.pdf,.docx,.xlsx,.doc,.xls" 是规定上传文件的类型&#xff0c;若是不限制&#xff0c;可以直接将accept‘all即可&#xff1b; b、:action"action" 这个属性就是你的上传附件的地址&am…

C语言 变量

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型&#xff0c;类型决定了变量存储的大小和布局&#xff0c;该范围内的值都可以存储在内存中&#xff0c;运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头…

为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactive 局限性问题&#xff1a; reactive本身存在一些局限性&#xff0c;可能会在开发过程中引发一些问题。这需要额外的注意力和处理&#xff0c;否则可能对开发造成麻烦。数据类型限制&#xff1a; reactive声明的数据类型仅限于对象&#xff0c;而…

灰度负载均衡和普通负载均衡有什么区别

灰度负载均衡&#xff08;Gray Load Balancing&#xff09;与普通负载均衡的主要区别在于它们服务发布和流量管理的方式。 灰度负载均衡 目的&#xff1a;主要用于灰度发布&#xff0c;即逐步向用户发布新版本的服务&#xff0c;以减少新版本可能带来的风险。工作方式&#x…

自定义View中的ListView和ScrollView嵌套的问题

当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察&#xff0c; 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…

形态学笔记:侵蚀+膨胀+开运算+闭运算+形态学梯度+顶帽运算+黑帽运算

形态学 一般在二值图上操作 输入&#xff1a;原图、操作结构内核 简单阈值 对于每个像素&#xff0c;应用相同的阈值。如果像素值小于阈值&#xff0c;则将其设置为0&#xff0c;否则将其设置为最大值 原图–>灰度图–>二值图 logo cv2.imread(./fans.jpg) # 参数1 …

代码随想录刷题笔记-Day26

1. 子集 II 90. 子集 IIhttps://leetcode.cn/problems/subsets-ii/ 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意…

配置多个后端 API 代理

在开发 React 应用时&#xff0c;通常会涉及到与后端 API 的交互。而在开发过程中&#xff0c;我们经常需要在开发环境中使用代理来解决跨域请求的问题。Create React App 提供了一种简单的方式来配置代理&#xff0c;即通过创建一个名为 setupProxy.js 的文件来配置代理规则。…

SpringCloud Alibaba(保姆级入门及操作)

第一章 微服务概念 1.0 科普一些术语 科普一下项目开发过程中常出现的术语,方便后续内容的理解。 **服务器:**分软件与硬件,软件:类型tomcat这种跑项目的程序, 硬件:用来部署项目的电脑(一般性能比个人电脑好) **服务:**操作系统上术语:一个程序,开发中术语:一个…

【Axure高保真原型】输入宽高控制图片尺寸

今天和大家分享输入图片宽高控制图片尺寸的原型模板&#xff0c;在输入框里输入图片的宽和高&#xff0c;图片会自动设置成对应数值的尺寸&#xff0c;包括了按比例或者自由设置两种方式&#xff0c;具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保…

代码随想录第46天|139.单词拆分 多重背包理论基础 背包总结

文章目录 单词拆分思路&#xff1a;代码 多重背包≈0-1背包题目代码 背包总结 单词拆分 3 思路&#xff1a; 代码 class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set new HashSet<>(wordDict);boolean[]…

基于Springboot的计算机知识竞赛网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机知识竞赛网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…
推荐文章