c语言中,共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
首先定义一个共用体:
union S {
int one;
float two;
char three[7];
};
通过最开始的文字,我们可以看到关键的一句,就是 在相同的内存位置存储不同的数据类型 。也就是说,结构体的属性,都是占用同一块内存的。
相当于正常情况下:每个人都会有一套属于自己的房子,房产证写的是他们的名字。(每个人对应每个属性,房子对应他们的内存)
而结构体则是:所有人都在同一个房子,房产证只能写上一个人的名字,如果你想这个房子属于张三,就在房产证上面写上张三的名字,那在你下次更改房主之前,这间房子就是张三的。
通过上面的解释,应该能大概清楚结构体存储的一个大概,我们再重新看一下最开始的结构体:
1、结构体总共有三个类型,int、float、char[8];
2、int占4字节、float占4字节、char[7]占1*7字节;
3、通过上面可以确定,这个结构体中占用内存最多的是three属性,占7字节;
4、最后占用的字节必须是最大对齐数的整数倍(这里的最大对齐数和结构体的最大对齐数不同)
联合体最大的类型是int(float):4字节,7不是是4的最大整数倍,所以不断7++,直到8
为4的最大整数倍即可;
5、通过上面就能确定,该联合体最大占用内存为8字节。
知道联合体内存存储状况,那 任何时候只能有一个成员带有值 也就能理解了。
如果联合体存了一个属性后(比如two),获取其他属性,也是two的属性值,但是会出现数据丢失之类的情况。