C语言构造类型总结(共用体)
一概述:
共用体又叫联合,因为它的关键字是union,它的使用不像枚举和结构体那么频繁,但是作为C语言中一种数据类型,我们也有必要弄清它的用法.
二.内存大小
从前面的分析,我们知道结构体的总长度等于所有成员的和(当然还可能遇到内存对齐问题),共用体刚好与结构体不同,共用体所有成员共用一块内存,顺序从低地址开始存放,一次只能使用其中一个成员,union最终大小由共用体中最大的成员决定,对某一成员赋值可能覆盖另一个成员.
这里需要解释:为什么t.a = -114,t.b=460420494,t.c=520.131400
而不是 t.a = 97,t.b =10; 当然t.c等于520.131400并不奇怪
前面提到:
1.共用体其实每次只能使用其中一个成员,对于上面的代码经过三次赋值,最终使用的其实就是t.c,
而通过上面的输出结果,我们也确实看到t.c是有效的。
2.共用体有一个特点就是它的成员存储在同一块内存区域,这块区域的大小需要根据它的成员中长度最大的成员长度而定。
由于上面的代码是64位编译器编译的:
char 1 字节
int 4 字节
double 8字节
所以Type长度为8.
(以下都是数字都是二进制,由于表抽风,将就一下):又根据上面输出的地址,可以得到下面的存储信息(注意数据的存储方式:高地址存储高位,低地址存储地位):
当读取c的时候,它的二进制“64,96,128,128,128,64”,换算成十进制520;
因为经过三次赋值,此时的b的长度是4,存储的时候被c的成员地位数据覆盖(64,96,128,128把,1,2,3,4,覆盖了)。换算成十进制就是460420494。
a也是一样意思被c覆盖了,所以换成十进制就是-114。
总结:
1.一次只能使用其中一个成员赋值,否则长度大的,会把长度低的覆盖.