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

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;
}

答案速查

分析

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

执行至return 0;

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

union U
{
	char a;
	int b;
};

struct S
{
	char a;
	int b;
};

6.联合体的大小计算

2条规则

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

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

例如:

求下列代码的执行结果

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

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

 答案速查

分析

如果不考虑第二点规则,答案应该是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;
}

答案速查

分析

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.kler.cn/news/326362.html

相关文章:

  • Python | Leetcode Python题解之第442题数组中重复的数据
  • plt注解相关介绍及应用
  • 封装提示词翻译组件
  • K8S:开源容器编排平台,助力高效稳定的容器化应用管理
  • 开放词汇目标检测
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能
  • 【单元测试】任务1:白盒测试1
  • 完成UI界面的绘制
  • DRF实操学习——购物车及订单生成
  • 【Redis 源码】1下载与源码编译
  • 使用CAPTCHA对反爬虫有优势吗
  • java 解析excel (网络资源)
  • Matlab|计及需求响应消纳风电的电热综合能源系统经济调度
  • 防火墙的区域划分+来自公网、内网的ip欺骗攻击+防御
  • 24.9.25学习笔记
  • 语音识别控制(软件、硬件)
  • 【Pytorch图像+序列双输入网络源代码】
  • mac 触控板 三指拖动
  • 【软件工程】模块化思想概述
  • 线性模型到神经网络
  • PyCharm开发工具的安装和基础使用
  • JVM(HotSpot):字符串常量池(StringTable)
  • DK5V100R20ST1直插TO220F功率12V 3A同步整流芯片
  • 解决目标主机showmount -e信息泄露(CVE-1999-0554)
  • 开创远程就可以监测宠物健康新篇章
  • C++ | Leetcode C++题解之第432题全O(1)的数据结构
  • Centos 8安装VNC及多用户配置详细教程
  • java socket bio 改造为 netty nio
  • 【算法业务】基于Multi-Armed Bandits的个性化push文案自动优选算法实践
  • 电商搜索效率飞跃:阿里巴巴搜索API返回值的力量