联合体union
当多个数据须要共享内存或者多个数据每次仅仅取其一时。能够利用联合体(union)。在C Programming Language 一书中对于联合体是这么描写叙述的:
1)联合体是一个结构;
2)它的全部成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合当中全部的成员;
以下解释这四条描写叙述:
因为联合体中的全部成员是共享一段内存的。因此每一个成员的存放首地址相对于于联合体变量的基地址的偏移量为0。即全部成员的首地址都是一样的。
为了使得全部成员可以共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合当中全部的成员”是指其必须符合全部成员的自身对齐方式。
以下举例说明:
如联合体
union U
{
char s[9];
int n;
double d;
};
s占9字节,n占4字节,d占8字节。因此其至少需9字节的空间。然而事实上际大小并非9,用运算符sizeof測试其大小为16.这是由于这里存在字节对齐的问题,9既不能被4整除。也不能被8整除。因此补充字节到16,这样就符合全部成员的自身对齐了。
从这里能够看出联合体所占的空间不仅取决于最宽成员。还跟全部成员有关系。即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包括的全部基本数据类型的大小所整除。
測试程序: