当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员;
下面解释这四条描述:
由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。
下面是用union 判断系统的大小端的程序
1. #include<stdio.h>
2. union var{
3. char c[4];
4. int i;
5. };
6.
7. int main(){
8. union var data;
9. data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
10. data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比
11. data.c[2] = 0x02;
12. data.c[3] = 0x11;
13. //数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
14. printf("%x\n",data.i);
15. }
结果:11020304证明我的32位linux是小端(little-endian)