65.【C语言】联合体

news2024/10/1 6:24:26

目录

目录

1.定义

2.格式

3.例题

答案速查

分析

4.练习

答案速查

分析

5.相同成员的联合体和结构体的对比

6.联合体的大小计算

2条规则

 答案速查

分析

练习

答案速查

分析

7.联合体的优点

8.匿名联合体


1.定义

和结构体有所不同,顾名思义:所有成员联合使用同一块内存空间,因此也叫共用体

注:编译器只为最大的成员分配足够的内存空间;如果不符合对齐数,则会增加一部分空间(有关联合体的大小计算见第6点)给联合体其中一个成员赋值,其他成员的值也跟着变化

2.格式

union 联合体标签
{
  //......
};

3.例题

求下列代码的执行结果

#include <stdio.h>
union U
{
	char a;
	int b;
};

int main()
{
	printf("%zd\n", sizeof(union U));
	union U u;
	printf("%p\n", &u);
	printf("%p\n", &u.a);
	printf("%p", &u.b);
	return 0;
}

答案速查

d4118c9946ba4652ad1c468a86b830dc.png

分析

01.printf("%zd\n", sizeof(union U));

编译器只为最大的成员分配足够的内存空间

char a 对齐数为1,int b对齐数为4(注:联合体对齐数的计算方法同结构体的),因此为a和b分配4字节的空间

02.printf("%p\n", &u); & printf("%p\n", &u.a); & printf("%p", &u.b);

所有成员联合使用同一块内存空间,因此取地址的结果一样

4.练习

求下列代码执行后,联合体在内存中存储的数据

#include <stdio.h>
union U
{
	char a;
	int b;
};

int main()
{
	union U u;
	u.b = 0x12345678;
	u.a = 0x99;
	return 0;
}

答案速查

VS2022按小端序存储

因此为99 65 43 21

分析

运行环境x86+debug

下断点(F9)至u.a = 0x99;,内存窗口输入&u

b9e13e41a08b461a9d4da5df5afd1d63.png

执行至return 0;

90a02df542a140eeac5840f939cea39a.png

5.相同成员的联合体和结构体的对比

union U
{
	char a;
	int b;
};

struct S
{
	char a;
	int b;
};

 

ac2dc47ab413436b94608d0967af1600.png025ef410d82543c893989cd7d66fa485.png

6.联合体的大小计算

2条规则

1.联合的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍(多数人往往会忽视第2点)

例如:

求下列代码的执行结果

#include <stdio.h>
union U
{
	char a[5];
	int b;
};

int main()
{
	printf("%zd", sizeof(union U));
	return 0;
}

 答案速查

8ed448d2452149db8085ca5330e76076.png

分析

如果不考虑第二点规则,答案应该是5

如果考虑第二点规则,

char a[5]; 自身对齐数:1,VS默认对齐数:8,所以对齐数为1

int b; 自身对齐数:4,VS默认对齐数:8,所以对齐数为4

a[5]与b的最大对齐数为4

所以联合体的大小至少为4的整数倍(4,8,12,...,4k),大于5且最近的4整数倍的数为8

练习

求下列代码的执行结果

#include <stdio.h>
union U
{
	short a[7];
	int b;
};

int main()
{
	printf("%zd", sizeof(union U));
	return 0;
}

答案速查

05214c9e024a433b9710d8eb6dc37303.png

分析

short a[7]; 自身对齐数:2,VS默认对齐数:8,所以对齐数为2

int b; 自身对齐数:4,VS默认对齐数:8,所以对齐数为4

如果不考虑第二点规则,答案应该是14(7*2=14)

如果考虑第二点规则,short a[7];与int b;的最大对齐数为4,所以联合体的大小至少为4的整数倍(4,8,12,...,4k),大于14且最近的4整数倍的数为16

7.联合体的优点

如果一些变量既有公共属性,又有各自的联合属性,可以把公共属性单独写出来,剩余属于各自本身的属性使用联合体起来(联合体内嵌结构体)

这样可以节省空间

8.匿名联合体

同匿名结构体,见文63.【C语言】再议结构体(上)

 

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

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

相关文章

Artec Leo 3D扫描助力Illumaesthetic公司加速汽车定制

挑战&#xff1a;Illumaesthetic公司正在寻求一种方法&#xff0c;对汽车改装的测量技术进行现代化改造。 解决方案&#xff1a;Artec Leo, Artec Eva, Artec Studio, Geomagic 效果&#xff1a;从手工雕刻、成型&#xff0c;转向3D扫描和3D打印&#xff0c;提高了公司设计和原…

QT——初识

目录 前言 1.创建一个QT项目 2.查看生成的文件 3.打印一条hello world&#xff01; ①使用控件实现 ②使用代码实现 4.Qt的编码格式 5.信号和槽 6.Qt中的坐标系 前言 QT是一款可跨平台的电脑客户端开发软件&#xff0c;本文将介绍一些有关QT使用的基础内容。 1.创建一个…

“大数据+高职”:VR虚拟仿真实训室的发展前景

随着信息技术的迅猛发展&#xff0c;大数据技术与虚拟现实&#xff08;VR&#xff09;的融合正在为高等教育&#xff0c;尤其是高等职业教育&#xff08;高职&#xff09;带来革命性的变革。VR虚拟仿真实训室作为这一技术融合的典型应用&#xff0c;正逐步展现其在提升教育质量…

热补丁反调试API Hook—上跳/下跳

以 IsDebuggerPresent 函数为例&#xff0c;可以看到可以上跳&#xff08;简单&#xff09;&#xff0c;也可以下跳&#xff08;复杂&#xff09;。 上跳&#xff1a; BYTE NewCodes[2] { 0xEB,0xF9 }; BYTE JmpCode[5] { 0xE9,0 }; BYTE oldCodes[2] { 0 };BOOL Mydebug() …

Tiny synopsis - 十分钟入门Linux系统【零基础】

10 minutes for Linux I) webpage address url resource II) context/excerpt former history OS not work conveniently, and expensive either…so write his own and free OS… initially, only a few functions with nearly over 10,000 lines of code, while the fate g…

PHP反序列化6(session反序列化)

考点6&#xff1a;session反序列化 <aside> &#x1f4a1; session的一些基础知识 </aside> Directive含义session.save_handlersession保存形式。默认为filessession.save_pathsession保存路径。session.serialize_handlersession序列化存储所用处理器。默认为…

仿真设计|基于51单片机的多模式音乐跑马灯

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 1、16个发光二极管做跑马灯&#xff0c;跑马灯有10种模式。 2、按键可以切换跑马灯模式&#xff0…

雅思IELTS应该选择笔试还是机考

International English Language Testing System (IELTS) 雅思是全球最受欢迎的国际英语测试之一&#xff0c;为升学、就业、移居海外打开机会&#xff0c;去年报考 雅思的人数高达 350 万人次。 雅思拥有良好的国际声誉&#xff0c;获全球超过 150 个国家、12,000 多所机构认…

SQL第11课——使用子查询

11.1 子查询 查询&#xff08;query): 任何SQL语句都是查询&#xff0c;但此术语一般指select语句。 select语句是SQL的查询&#xff0c;迄今为止所有的select语句都是简单查询&#xff0c;即从单个数据库表中检索数据的单条语句。 SQL还允许创建子查询&#xff08;subquer…

nginx+php+postgresql搭建漏洞靶场

经过我多番查找,最终得出一个结论,dvwa暂时不支持 postgresql 本文给大家提供一个思路,千万不要轻易模仿 更新系统包列表 首先,打开终端并更新你的系统包列表: sudo apt updatesudo apt upgrade -y安装必要的软件包 安装Nginx、PHP、PostgreSQL以及一些必要的PHP扩展:…

抓取网页重定向之前的接口请求

使用谷歌浏览器&#xff0c;按下F12抓取接口的时候&#xff0c;会遇到无法抓取web页面重定向之前的地址的问题&#xff0c;这个时候可以使用以下两种方式进行抓取&#xff1a; 1.断网操作&#xff0c;选择开发者调试工具下面的&#xff0c;网络离线功能进行离线操作 2.使用保留…

Chromium 屏蔽“缺少 Google API 密钥,因此 Chromium 的部分功能将无法使用。”提示 c++

新编译的Chromium工程默认gn参数如下: 可以利用gn args --list out/debug >1.txt 导出默认参数 google_api_key Current value (from the default) "" From //google_apis/BUILD.gn:43 Set these to bake the specified API keys and OAuth client …

NR不同小区带宽的RB数

1. FR1 下表为FR1中不同小区带宽对应的最大RB数量。 SCS (kHz) 5 MHz 10 MHz 15 MHz 20 MHz 25 MHz 30 MHz 40 MHz 50 MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz 15 25 52 79 106 133 160 216 270 N/A N/A N/A N/A N/A 30 11 24 38 51 6…

登录功能开发 P167重点

会话技术&#xff1a; cookie jwt令牌会话技术&#xff1a; jwt生成&#xff1a; Claims&#xff1a;jwt中的第二部分 过滤器&#xff1a; 拦截器&#xff1a; 前端无法识别controller方法&#xff0c;因此存在Dispa什么的

仿真设计|基于51单片机的双机通信控制数码管显示

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;双机通信系统分为通讯发送端和通讯接收端。 &#xff08;2&#xff09;…

5G上的时敏网络:带有IEEE 802.1Qbv流量的混合5G和TSN系统的实验评估

论文标题&#xff1a;Time-Sensitive Networking over 5G: Experimental Evaluation of a Hybrid 5G and TSN System with IEEE 802.1Qbv Traffic 作者信息&#xff1a;Adnan Aijaz 和 Sajida Gufran&#xff0c;来自英国布里斯托尔的Toshiba Europe Ltd.的Bristol Research a…

Vue 技术进阶 day2 数据监视的原理、其他内置指令、自定义指令、生命周期、组件化、VueComponent构造函数

目录 1.Vue监测数据的原理 1.1 原理 1.1.1 数据劫持 1.1.2 观察者模式(Vue内部的实现) 1.1.3 更新组件 1.1.4 计算属性和侦听器 1.2 后添加属性做响应式&#xff08;Vue.set / vm.$set&#xff09; 1.3 对象和数组的响应式 1.4 数据监视案例 2.指令 2.1 内置指令 2.…

threejs三维可视化完全开源案例突破100个了

好激动呀&#xff0c;经过不断努力&#xff0c;三维开源案例&#xff0c;已经突破100个共享 赶快来逛逛吧&#xff01; 官网&#xff1a;https://threelab.cn/ 源码地址&#xff1a;https://github.com/AivoGenX/threelab-threejs-webgpu-vue-js

OkHttp 详细使用步骤,以及异步请求和同步请求

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

springboot+vue+elementui大文件分片上传

工具类方法&#xff1a; /*** 大文件分片上传* param fileName 文件名* param file 文件* param fileKey 文件key* param shardIndex 当前分片下标* param shardTotal 分片总量*/public static void bigUpload(String fileName,MultipartFile file, String fileKey, L…