开始的话

已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了)、重构(后期我也会说的了)了,却忽略了那些最基础,最根本的知识点。今天别人问我,我蒙了,所以,就有了这篇文章。

什么是union?

翻译过来说,就是共用体,或者也叫联合体。说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时:

代码如下:

struct student

{

char mark;

long num;

float score;

};

关于struct的内存结构,将就会像下图所示这样(在x86机器上演示):

sizeof(struct student)的值为12bytes。但是,当我们定义如下的union时,

代码如下:

union test

{

char mark;

long num;

float score;

};

sizeof(union test)的值为4。这为什么呢?这就是需要说的。 有的时候,我们需要几种不同类型的变量存在在同一段的内存空间中,就像上面的,我们需要将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中。上面的三个变量,char类型和long类型所占的内存字节数是不一样的,但是在union中,它们都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。上面定义的union类型的结构如下:

上面也说了,sizeof(union test)的值为4。那为什么是4呢?大体上来说,结构体struct所占用的内存为各个成员的占用的内存之和(当然也需要考虑内存对齐的问题了)。而对于union来说,在谭浩强的《C语言程序设计》中这么说:union变量所占用的内存长度等于最长的成员的内存长度。很显然,这是不对的,对于union所占用的内存大小,需要考虑内存对齐的问题。这就是为什么sizeof(union test)的值为4啦。

C中使用union

说的再好,再多,终归都是要在使用的,下面就好好的说说C中使用union。和struct一样,union只有先定义了共用体变量才能引用它。而且不能直接引用共用体变量,而只能引用共用体变量中的成员。就像我上面定义的union test。我们不能像下面这样直接引用union:

代码如下:

union test a;

printf("%d", a);

这种直接引用是错误的,由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。所以,应该写成下面这样:

代码如下:

printf("%d", a.mark);

同时,在使用union的时候,我们还需要注意以下的几点:

1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。

2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:

代码如下:

#include

using namespace std;

union test

{

char mark;

long num;

float score;

}a;

int main()

{

// cout

c语言union内存大小,C语言、C++中的union用法总结相关推荐

  1. 计算机能够运行的程序的大小不能超过内存,内存大小是影响电脑中运行的程序的速度...

    内存大小是影响电脑中运行的程序的速度 内存与 CPU 是属于桥梁关系,任何运行的程序都必须经过内存.只要计算机在运行中,CPU 就会把需要运算的数据调到内存中进行运算,当运算完成后 CPU 再将结果传 ...

  2. C语言数组内存大小判断

    1.数组内存大小判断方法 直接用关键词sizeof进行判断. 2.案例 2.1 源文件 andy@andy-virtual-machine:~/GNU_C_Programming/unpakage_d ...

  3. C语言 数组内存溢出 - C语言零基础入门教程

    目录 一.数组内存溢出简介 二.数组内存溢出实例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.数组内存溢出简介 溢出:想象一个桶, ...

  4. c语言单精度比大小,c语言单精度和双精度的区别.pdf

    c 语言单精度和双精度的区别 c 语言单精度和双精度的区别单精度是这样的格式, 1 位符号, 8 位指数, 23 位小数. 双精度是 1 位符号, 11 位指数, 52 位小数. 区别就是它所能存储的 ...

  5. linux查服务器总内存大小,怎么查看linux中的可用内存大小

    怎么查看linux中的可用内存大小 发布时间:2020-06-16 13:28:33 来源:亿速云 阅读:620 作者:鸽子 作为Linux用户,特别是管理员,我们需要检查系统使用多少内存资源以及有多 ...

  6. c语言 获取可用内存大小,C语言实现获取内存信息并输出的实例

    C语言实现获取内存信息并输出的实例 实现实例代码: headfile.h #include #include #include #define TRUE 1 #define FALSE 0 #defi ...

  7. c语言指针如何增加内存大小,C语言如何给指针分配内存?

    匿名用户 1级 2010-09-20 回答 看了下,基本上回答的都是用new 那个,都是C++程序员吧 c语言里面是用malloc的 写了个简单程序,看看是不是楼主需要的 #include #incl ...

  8. C++_类和对象_C++继承_继承中的对象模型_占内存大小---C++语言工作笔记063

    然后我们再来看继承中的对象模型. 继承过来的成员,哪些是属于子类对象的呢? 比如有个基类 然后我们写了个Son类继承Base类 然后我们再写个test01测试类,可以看到cout输出了子类的size, ...

  9. c语言设置bufsiz大小,c语言缓冲区有关问题及c++中的this指针

    c语言缓冲区问题及c++中的this指针 1.怎么改变c中缓冲区的大小,使用setbuf[stout,buf];改变buf的大小并不能改变缓冲区的大小,而函数 说明中要求把buf大小设置成BUFSIZ ...

最新文章

  1. 图论--欧拉路,欧拉回路(小结)
  2. Visual Studio原生开发的20条调试技巧(下)
  3. 一个可以显示具体时间的日历控件应用
  4. 最新发布丨游戏市场“超预期”增长背景下,如何加速产品精品化 运营精细化?...
  5. 神策数据与 IPIP.NET 强强联合,精准 IP 让用户行为分析更精确
  6. 解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate
  7. python---django中权限框架设计
  8. C语言结构体占用内存总结
  9. SAP UI5加载时的library-preload.json文件
  10. 集合三人斗地主的思路
  11. NYOJ--927--dfs--The partial sum problem
  12. C语言for循环的嵌套例题,c语言 for循环的嵌套(含答案)
  13. Windows下SVN备份脚本
  14. 软件项目的规模、工作量和成本是如何进行估算或评估的?
  15. 基本社会里模型的源码分析
  16. Mac批量恢复废纸篓文件
  17. 重启Usb蓝牙设备(PD虚拟机模拟插拔)
  18. 用html如何设计日历,用CSS设计日历
  19. 说说 PWA 和微信小程序--Progressive Web App
  20. RAKsmart:美国服务器租用对建站有哪些帮助?

热门文章

  1. ui设计师可以做到多少岁
  2. 什么对象都有prototype吗?
  3. 计算机桌面的内存设置方法,电脑提示内存不足怎么办 虚拟内存设置方法【详解】...
  4. 与天斗,与地斗,与人斗,其乐无穷!!!
  5. 数据泵--导入时自动创建用户
  6. [UVM]UVM环境中的clock agent方案
  7. QTreeWidget 与复选框相同的节点选择
  8. mysql中日期时间戳timestamp使用小结
  9. 【题解】自己口胡的一道题目
  10. python设置列宽度_如何在xlsxwri中自动设置列的宽度