当前位置: 首页 > news >正文

65.【C语言】联合体

目录

目录

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语言】再议结构体(上)

 

相关文章:

  • Databend 实现高效实时查询:深入解读 Dictionary 功能
  • 对于基础汇编的趣味认识
  • 综合练习 学习案例
  • 【AIGC】ChatGPT提示词助力自媒体内容创作升级
  • 笔记本电脑如何改ip地址:操作指南与注意事项
  • 深度解析:Python蓝桥杯青少组精英赛道与高端题型概览
  • 程序设计语言
  • JavaScript模块化-CommonJS规范和ESM规范
  • 论文阅读(十一):CBAM: Convolutional Block Attention Module
  • C++入门(有C语言基础)
  • 并行编程实战——TBB框架的应用之一Supra的基础
  • 【2024】前端学习笔记11-网页布局-弹性布局flex
  • 常用bash脚本
  • 在大数据爬取中选择合适的IP
  • OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
  • [nginx文档翻译系列] 控制nginx
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • C语言笔记(第一章:C语言编程)
  • golang 发送GET和POST示例
  • happypack两次报错的问题
  • js 实现textarea输入字数提示
  • JS专题之继承
  • laravel 用artisan创建自己的模板
  • Otto开发初探——微服务依赖管理新利器
  • Spring Cloud中负载均衡器概览
  • spring security oauth2 password授权模式
  • ubuntu 下nginx安装 并支持https协议
  • 关于List、List?、ListObject的区别
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 实现菜单下拉伸展折叠效果demo
  • 思考 CSS 架构
  • 学习使用ExpressJS 4.0中的新Router
  • 赢得Docker挑战最佳实践
  • 原生 js 实现移动端 Touch 滑动反弹
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 交换综合实验一
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (1)svelte 教程:hello world
  • (2)空速传感器
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)Scala的“=”符号简介
  • *Django中的Ajax 纯js的书写样式1
  • .NET/C# 项目如何优雅地设置条件编译符号?