C语言中的联合体的由来和存储

一、联合体的由来

1.1. 数据类型的不足

C语言中,基本数据类型只有整型、字符型、浮点型等少数几种,无法满足复杂数据类型的需要。

1.2. 数组的限制

虽然数组可以存储多个同类型的数据,但是数组中的元素个数是固定的,无法动态地改变大小。

1.3. 结构体的限制

结构体中的成员变量都是独立的,它们在内存中的地址是连续的,无法同时指向多个变量。

为了解决以上问题,C语言引入了联合体(union)这一复合数据类型。联合体是由一组不同类型的变量组成的集合,这些变量共享同一块内存空间,也就是说,联合体中只有一个成员变量在某一时刻是有效的。
在这里插入图片描述

二、联合体的使用方法

2.1. 定义联合体类型

使用关键字union和大括号{}来定义联合体类型,其中包含若干个成员变量。例如:

union Student {char name[20];int age;float score;
};

上述代码定义了一个名为Student的联合体类型,它包含三个成员变量:name(字符串类型)、age(整型)和score(浮点型)。

2.2. 声明联合体变量

声明联合体变量时,需要指定其类型为已定义的联合体类型。例如:

union Student stu1, stu2;

上述代码声明了两个Student类型的联合体变量stu1和stu2。

2.3. 访问联合体成员变量

通过“.”运算符来访问联合体变量中的成员变量。需要注意的是,由于联合体中只有一个成员变量在某一时刻是有效的,因此访问不同的成员变量时,之前的成员变量的值会被覆盖掉。例如:

strcpy(stu1.name, "Tom"); // stu1.name有效,其他成员变量无效
stu1.age = 18; // stu1.age有效,其他成员变量无效
stu1.score = 90.5; // stu1.score有效,其他成员变量无效

上述代码分别给stu1的name、age和score成员变量赋值。由于联合体中只有一个成员变量在某一时刻是有效的,因此每次赋值操作都会覆盖掉之前的成员变量的值。如果需要同时保存多个值,可以使用结构体或者指针来实现。
在这里插入图片描述

三、联合体在计算机中的存储方式

3.1. 内存对齐

为了提高内存读写效率,编译器会对联合体进行内存对齐。内存对齐是指将联合体中的成员变量按照一定的规则排列在内存中,使得它们的地址都是某个特定值的倍数。例如,对于一个int类型的变量,它的地址必须是4的倍数;对于一个char类型的变量,它的地址必须是1的倍数。如果某个成员变量按照默认对齐方式排列后,其地址不是某个特定值的倍数,编译器会在其前面填充一些空白字节,使其地址变为某个特定值的倍数。例如:

union Student {char name[20]; // 地址为0x00000000,不需要对齐int age;       // 地址为0x00000004,需要对齐,填充3个空白字节(即地址为0x00000004)float score;   // 地址为0x00000008,需要对齐,填充3个空白字节(即地址为0x00000008)
};

上述代码中,Student联合体的大小为16个字节(2+4+4=12),因为name数组后面有3个空白字节(即sizeof(name)=12)。需要注意的是,不同的编译器可能会对联合体的内存对齐方式和大小计算方法有所不同。因此,在编写程序时应该尽量避免依赖于具体的内存布局细节。

3.2. 联合体的大小计算

联合体的大小等于其最大成员变量的大小。如果成员变量之间有空白字节,那么这些空白字节也会被计算在内。例如:

union Student {char name[20]; // 占用20个字节(包括末尾的'\0')int age;       // 占用4个字节(假设为int类型)float score;   // 占用4个字节(假设为float类型)
};

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

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

相关文章

大数据Doris(四十二):使用物化视图

文章目录 使用物化视图 一、​​​​​​​创建物化视图

【负载均衡oj】(四) 运行模块

一.目的 主要负责运行可执行程序。通过文件名就能运行程序。 二.runner run运行模块: 不需要关心运行结果是否正确,只具备基本运行功能并只关心是否运行出错。 一个程序的时候,有三种IO需要关心,标准错误,标准输出&#xff0c…

esp32cam和arduino连接百度云AI识别文字接口识别图片文字

要使用esp32cam和arduino连接百度云AI识别文字接口识别图片文字并将结果打印到串口,你可以按照以下步骤操作: 首先,你需要注册百度云AI平台账号并创建一个文字识别应用。获取到应用的API Key和Secret Key。 在Arduino IDE中安装ESP32和ESP32…

Kubernetes调试终极武器: K8sGPT

K8sGPT结合了GPT的AI能力,为智能化分析和运维Kubernetes集群提供了开箱即用的解决方案。原文: K8s Tools — K8sGPT[1] 随着人工智能和机器学习技术的进步,企业和组织越来越多的探索创新战略,以求利用这些能力来获得竞争优势。 K8sGPT[2]就是…

vue3+luckyexcel+php在线编辑excel文件

开发过程中,需要开发一个在线编辑excel文档的功能,找到了这个合适的组件 Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 可以导入文档,预览、编辑、保存、导出等功能,可以满…

Abductive Logical Reasoning on Knowledge Graphs

Q: 这篇论文试图解决什么问题? A: 这篇论文试图解决在知识图谱(Knowledge Graphs, KGs)上进行反推逻辑推理(Abductive Logical Reasoning)的问题。具体来说,论文提出了一个任务:给定一组实体的…

去水印软件哪个好用?用他们就够了

随着数字媒体的发展,越来越多的人开始需要处理带有水印的图片或视频。水印不仅是一种版权保护手段,也常常被用来标记图片或视频的来源。然而,在某些情况下,我们可能需要去除水印以实现更好的使用效果。那么,去水印软件…

机器学习之BP神经网络精讲(Backpropagation Neural Network(附案例代码))

概念 BP神经网络(Backpropagation Neural Network)是一种常见的人工神经网络,它通过反向传播算法来训练网络,调整连接权重以最小化预测输出与实际输出之间的误差。这种网络结构包含输入层、隐藏层和输出层,使用梯度下降算法来优化权重。 结构: BP神经网络(Backpropag…

PCB丝印设计的要求和注意事项有哪些呢?

丝印设计是PCB设计中必不可少的因素,PCB板上丝印通常包括:元器件丝印及位号、板名、版本号、防静电标识、条码丝印、公司LOGO及其他一些标识。接下来,让我们一起看看PCB设计中对于丝印设计的要求。 一、丝印设计要求 丝印字符的字高和字宽之…

使用克魔助手查看IOS游戏FPS的方法详解

查看IOS游戏FPS 摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率(FPS)。通过克魔助手,开发者可以轻松监测游戏性能,以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中,了解游戏的帧率对于优化…

C++游戏引擎中骨骼动画和顶点动画

一.帧/帧时刻 在常见的FPS游戏中,人物的行走,物体的变形等等都是采用动画的方式实现.计算机2D屏幕采用扫描周期的方式定时刷新渲染管线,C程序通过定义帧/帧时刻实现每一帧的渲染,不同的帧衔接起来便是一个完整的动画. Direct3D提供API实现2D屏幕的重绘: D3DDevice->Clear(0,…

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型,它的主要目标是确保数据的准确性和一致性,防止未授权的修改和破坏。在这个模型中&#…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍: SpreadJS 基于 HTML5 标准,支持跨平台开发和集成,支持所有主流浏览器,无需预装任何插件或第三方组件,以原生的方式嵌入各类应用,可以与各类后端技术框架相结合。SpreadJS 以 纯前…

优化axios封装之配置使用AbortController取消重复请求 防止用户频繁操作调用接口

当数据量过大请求缓慢时用户点击按钮或者tab标签页快速重复调用同一个请求时,会导致数据错乱,当只需要最新的请求数据,并且中断上一个重复请求时,可以利用axios的CancelToken去中断之前的请求。 ps:由于不是所有请求都需要这个逻辑…

使用Docker快速安装grafana

Docker 提供了一个轻量级、易于部署的容器化解决方案,让您能够方便地在不同环境中运行应用程序。以下是在 Docker 中安装 Grafana 的基本步骤: 文章目录 使用Docker快速安装grafana如何使用Grafana步骤 1:连接数据源步骤 2:创建仪…

打开相机失败 出现错误的原因

如何解决? Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签:QT添加库(静态库和动态库)_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

couldn‘t find “libmmkv.so“ android8.1.0 Nexus 5X

我们的应用一直没有奔溃,但是在某几款设备可能存在mmkv的报错。 研究了很久,一方面是因为mmkv团队也已经不管这个事情,从他的issue来看,每次有人提到这个,他要么就不予理睬,给出这个并非库维护者需要干的事…

ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统

链接:https://pan.baidu.com/s/1AgevUZleCHBJgCBcIp5CFQ?pwdhjxy 提取码:hjxy 华硕笔记本2023款幻16原厂Windows11系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、Armoury Crate奥创控制中心等预装程序 文件格式&#xff1…

WEB渗透—PHP反序列化(九)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响,数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值,想要保护企业核心资产,就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…