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

联合体知识点解析

联合体:

联合体也是一种自定义类型, 特点是成员变量公用一块空间。所以也叫共用体。

联合体的性质

先定义一个联合体

然后我创建一个联合体变量:

现在探究当修改一个成员变量的值时, 其他成员变量的值能否被修改(既然共用内存, 那么其他成员的值应该是能被修改的)。 

现在观察的是该结构体变量的内存空间, 图中画红线的就是结构体变量的内存空间。

此时程序运行刚刚将un.a赋值。

 通过观察我们可以发现, un.c的赋值改变了un.a的值。

现在我们再来探究令一条性质:联合体的成员变量的存储位置是从哪里开始。

由图中我们可以发现, 联合体的成员都是在联合体变量的首地址开始存储。

联合体内存的大小

那么,联合体的内存大小怎么计算呢?

联合体的内存大小至少要比最大的成员变量的大小要大, 因为只有这样才能保证该成员变量的数据被存储下来。

其次联合体的内存大小也会用到对齐数。 当成员变量的最大值不是对齐数的整数倍时, 那么联合体的大小就是那个比成员变量最大值大的那个对齐数的整数倍。

如:

 利用联合体求取大小端

 我们都知道数据在内存中的储存是有大小端问题的(如果忘记了,请前往我的c语言专栏——c语言各个数据类型在内存中的存储方式),那么如何利用c语言来求取编译器是大端存储还是小端存储呢?

现在来实现一下:

首先, 我们通过上面的分析,已经知道了联合体的成员变量都是在联合体变量的首地址开始存储, 也就是低地址处开始存储。 所以对于un.a来说, 访问的话那么访问的就是联合体的第一个偏移量内的空间。

既然访问的是第一个偏移量内的空间也就是低地址处的空间, 并且这个空间存储的是0x44。那么我们就可以断定, un.c是将高位字节序的数据存储到了高地址处, 低位字节序的数据存储到了低地址处。


http://www.kler.cn/a/233054.html

相关文章:

  • Linux如何更优质调节系统性能
  • golang如何实现sse
  • 相机光学(四十二)——sony的HDR技术
  • 【pytorch】常用强化学习算法实现(持续更新)
  • AI 写作(五)核心技术之文本摘要:分类与应用(5/10)
  • 【 ElementUI 组件Steps 步骤条使用新手详细教程】
  • 如何用Hexo搭建一个优雅的博客
  • 单片机学习笔记---DS1302时钟
  • django中实现登录
  • 微信小程序的图片色彩分析,窃取网络图片的主色调
  • Python中使用opencv-python库进行颜色检测
  • 【芯片设计- RTL 数字逻辑设计入门 7 -- 同步复位与异步复位详细介绍】
  • 使用Collections.singletonList()遇到的问题
  • Unity学习笔记之【IK反向动力学操作】
  • 20240209-最大可整分子集
  • c#: 表达式树的简化
  • 科研绘图-半小提琴图-
  • List 差集
  • 【开源】JAVA+Vue+SpringBoot实现房屋出售出租系统
  • vue父子组件通讯的几种方式总结学习
  • 基于SpringBoot的记账系统项目
  • Vagrant 虚拟机工具基本操作指南
  • echarts 一条折线图上显示不同颜色
  • 【Android】GridLayout实现等比布局
  • DC-9靶机渗透详细流程
  • 每日五道java面试题之java基础篇(一)