【C语言】联合(共用体)

目录

一、什么是联合体

二、联合类型的声明

三、联合变量的创建

四、联合的特点

五、联合体大小的计算

六、联合的应用(判断大小端)

七、联合体的优缺点

7.1 优点

7.2 缺点


一、什么是联合体

联合也是一种特殊的自定义类型。由多个不同类型的数据成员组成的复合数据类型。

这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合也叫:共用体。

二、联合类型的声明

定义一个联合类型的形式如下:

union 联合名

{

成员列表

};

成员列表中含有若干成员,成员的一般形式为: 类型说明符 成员名

成员名的命名应符合标识符的规定。

三、联合变量的创建

#include <stdio.h>//联合类型的声明
union Un
{char c;int i;
}un2; //声明的同时并创建un2union Un un3;//先声明再创建un3 (全局变量)int main()
{//联合变量的定义union Un un1 = { 0 };//先声明再创建un1并初始化 (局部变量)return 0;
}

四、联合的特点

我们运行下面一段代码:

#include <stdio.h>union Un
{char c;int i;
};
int main()
{union Un un = { 0 };printf("%d\n", sizeof(un));//计算联合体的大小return 0;
}

运行结果如下:

为什么运行结果为4呢?

那我们就要引入联合体的特点了。


        联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

        由于联合体的所有成员共用同一空间,改变其中一个成员的值可能会影响到其他成员的值,因此联合体中的成员不能同时存在,只适合在某一时间只使用其中单个成员时使用。

就像共享自行车,共享状态,但只能一个人骑,你骑我不骑,我骑你不骑。

例如:

#include <stdio.h>union Un
{char c;int i;
};int main()
{union Un un = { 0 };un.i = 0x11223344;un.c = 0x00;printf("%x\n", un.i);return 0;
}

调试结果如下:

我们发现运行到c的时候a跟着改变了,将a的第4个字节的内容修改为00了。

先改变的是低地址处的数据(这里是小端存放)。

由此可以发现:联合体的成员是共用一块内存空间的。

五、联合体大小的计算

  1. 联合的大小至少是最大成员的大小。
  2. 联合体在计算大小的时候也存在内存对齐。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

例:

#include <stdio.h>union Un1
{char c[5]; //1 8 1//看类型,相当于5个char放在这里,所以自身对齐数为1,默认对齐数为8int i; //4 8 4};int main()
{printf("%d\n", sizeof(union Un1));//输出8return 0;
}

分析:

        1、创建一个char类型数组,大小为5个字节,这里相当于5个char,自身对齐数为1,默认对齐数为8,所以对齐数为1。

        2、int类型的i自身大小为4个字节,默认对齐数为8,自身对齐数为4,所以对齐数为4。

i和c中最大的对齐数为4,而最大成员大小是数组c(5个字节),5不是4的倍数,对齐规则要求:对齐到最大对齐数(4)的整数倍,所以输出8。

        3、虽然共开辟了8个字节,但是只用了5个字节,剩余3个字节没有用。


注意

下图中这两种写法并不等价,这样写是为了方便理解对齐数那里。

第一个arr占用5个字节(共用5个字节),第二个占用1个字节大小(共用1个字节)

例子:

union Un1
{char c[5];int i;
};union Un2
{char c1; char c2;char c3;char c4;char c5;int i;
};int main()
{printf("%d\n", sizeof(union Un1));//输出8printf("%d\n", sizeof(union Un2));//输出4return 0;
}

六、联合的应用(判断大小端)

可以通过联合体,可以在不使用额外内存的情况下,判断计算机是大端存储还是小端存储。

代码如下:

#include <stdio.h>int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c; //返回1是小端,返回0是大端
}int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else {printf("大端\n");}
}

分析如下:

七、联合体的优缺点

7.1 优点

1、节省空间:

联合体可以最大程度地节省内存,特别是当有多个变量是同一类型的时候。

2、数据类型之间的转换:

联合体可以用于在不同的数据类型之间转换。

联合体的数据之间的转换是指将联合体的一个成员转换为另一个成员的过程。

数据之间的转换可以通过强制类型转换或直接访问成员来实现。

7.2 缺点

1、不安全:

联合体不提供任何形式的数据隔离,这意味着一个变量可以覆盖另一个变量的数据。所以在访问联合体成员时,需要保证访问的成员与最后一次赋值的成员类型相同,否则可能会出现数据错误或不可预期的结果。

2、可移植性问题:

不是所有的系统对联合体中的对齐做出相同的保证,这可能导致在一个系统上运行正常的代码在另一个系统上出现问题。

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

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

相关文章

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

数据库开发——并发控制(第十一章)

文章目录 前言并发执行例题一、封锁二、封锁协议三、可串行调度四、总结 学习目标&#xff1a;重点为并发控制的基本概念及几个基本协议 前言 数据库管理系统必须提供并发控制机制&#xff0c;保证事务的隔离性和一致性 并发执行例题 一、封锁 排他锁称为写锁&#xff0c;共…

atmega8 上传程序

使用icsp 烧写时先关闭串口程序&#xff0c;与串口uart连接相关的电路勿于电脑连接 接触不良 1.使用icsp 上传 1&#xff09;可以直接上传程序 如官方示例blink 或是 serial示例 2&#xff09;可以先烧录bootload 方便下次使用串口上传程序代码 A)使用专门的icsp 上传器上传…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

【iOS】如何断点看系统方法在哪一个库

如何断点看系统方法在哪一个库 开源网站如何断点看系统方法在哪一个库1 下符号断点2 符号断点中输入 load &#xff0c;并且开启断点&#xff08;Enable&#xff09;。3 运行程序&#xff0c;触发断点&#xff0c;在堆栈信息中找到load方法&#xff0c;可以看到其在libobjc.A.d…

程序员的wsl2

坑 wsl无法打开 上班时打开wsl2提示 WSL 正在完成升级... Could not write value to key \SOFTWARE\Classes\Directory\shell\WSL. Verify that you have sufficient access to that key, or contact your support personnel. 原因未知&#xff0c;之前并没有更新过&#xff…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG&#xff08;URGent&#xff09; ② 确认ACK&#xff08;ACKnowledgment&#xff09; ③ 推送PSH&#xff08;PuSH&#xff09; ④复位RST&#xff08;ReSeT&…

Hexo 搭建个人博客(ubuntu20.04)

1 安装 Nodejs 和 npm 首先登录NodeSource官网&#xff1a; Nodesource Node.js DEB 按照提示安装最新的 Node.js 及其配套版本的 npm。 &#xff08;1&#xff09;以 sudo 用户身份运行下面的命令&#xff0c;下载并执行 NodeSource 安装脚本&#xff1a; sudo curl -fsSL…

【牛客面试必刷TOP101】Day32.BM68 矩阵的最小路径和和BM69 把数字翻译成字符串

文章目录 前言一、BM68 矩阵的最小路径和题目描述题目解析二、BM69 把数字翻译成字符串题目描述题目解析总结 前言 一、BM68 矩阵的最小路径和 题目描述 描述&#xff1a; 给定两个字符串str1和str2&#xff0c;输出两个字符串的最长公共子序列。如果最长公共子序列为空&#x…

webpack逆向

声明&#xff1a;个人总结记录一下&#xff0c;避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话&#xff0c;全局搜所 69725 找到类似n(69725) ,单点n进去&#xff0c;可以找到加载器 2、调用 通过赋值的方…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程&#xff0c;使用atomic 来实现一次只能允许一个应用访问 LED&#xff0c;创建atomic.c文件&#xff0c;其实改动内容就是添加原子变量&#xff0c; 要在设备结构体数据添加…

vue2 + element-ui,前端配置化表单封装(2024-06-14)

技术栈是 vue2 element-ui&#xff0c;主要能解决的问题就是 提高代码复用能力、提升开发效率&#xff0c;特别是需要开发多个大型表单系统的&#xff0c;配置化可以极大的提升效率&#xff0c;让你上班摸鱼不再是梦想&#xff01;为了早点下班&#xff0c;我们接着往下看吧&a…

(Java微服务项目实战)dtpay聚合支付系统对账管理模块系统设计

1 聚合支付系统对账流程 dtpay聚合支付系统对账模块主要涵盖商户侧对账和渠道侧对账、平台侧对账&#xff0c;本文主要分析渠道侧对账。dtpay聚合支付系统通过支付渠道微信、支付宝等产生的支付退款交易数据需要和平台侧产生的数据进行交易数据比对。接下来我们具体分析对账流…

一款不写代码的开源爬虫工具!!【送源码】

爬虫&#xff0c;也被称为网络爬虫或网络蜘蛛&#xff0c;是一种自动化的网络机器人&#xff0c;其主要功能是按照一定的规则&#xff0c;自动浏览互联网并从网页中提取信息。 作为一个开发人员&#xff0c;相信大家都尝试过写一些爬虫&#xff0c;合理的利用一些爬虫工具&…

金融行业的等保测评要求

金融行业的等保&#xff08;网络安全等级保护&#xff09;测评要求是确保金融机构的信息系统达到一定的安全保护水平&#xff0c;以保护客户信息和金融交易的安全。等保测评在金融行业中的具体要求和流程主要包括以下几个方面&#xff1a; 等保级别 金融行业信息系统依据其重…

深入理解并打败C语言难关之一————指针(4)

前言&#xff1a; 我们在前面的几讲中已经讲了指针的很多内容了&#xff0c;现在我们开始层层递进&#xff0c;要探寻更多的指针喽&#xff0c;不多废话了&#xff0c;直接进入正题&#xff0c;开始今天的指针之旅喽&#xff01; 目录&#xff1a; 1.字符指针变量 1.1常量字符…

MEGALODON:突破传统,实现高效无限上下文长度的大规模语言模型预训练和推理

在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;大模型&#xff08;LLMs&#xff09;的预训练和推理效率一直是研究的热点。最近&#xff0c;一项突破性的研究提出了一种新型神经网络架构——MEGALODON&#xff0c;旨在解决传统Tran…

阿里新发布的UniAnimate现高效人像动画生成;在ComfyUI中使用Stable 3模型;音频版的gpt2o;将 PDF 文档转换为音频播客

✨ 1: UniAnimate 阿里新发布的UniAnimate通过统一的视频扩散模型&#xff0c;实现高效人像动画生成&#xff0c;支持长视频生成 UniAnimate 是一种专注于一致性人像动画生成的统一视频扩散模型。该模型通过映射参考图像、姿势指导和噪声视频到一个共同特征空间&#xff0c;实…

ZED双目相机环境配置

官方资料&#xff1a;stereolabs/zed-python-api: Python API for the ZED SDK (github.com) 1&#xff0c;配置ZED相机环境 1.安装CUDA 查看电脑是否安装CUDA&#xff0c;安装过程可参考以下博文&#xff1a; 如何选择匹配的CUDA版本&#xff1a;https://blog.csdn.net/iam…