union关键字与struct关键字的用法很相似,先看例子:
#include <stdio.h> int main(void) { /*struct结构体*/ struct { int i; char a[4]; }s; /*union结构体*/ union { int i; char a[4]; }u; printf("sizeof(int)=%d\n",sizeof(int)); /*s结构体赋值*/ s.a[0] = 0x00; s.a[1] = 0x01; s.a[2] = 0x00; s.a[3] = 0x00; printf("s.i=%d\n",s.i); /*u结构体赋值*/ u.a[0] = 0x00; u.a[1] = 0x01; u.a[2] = 0x00; u.a[3] = 0x00; printf("u.i=%d\n",u.i); }
打印结果:
sizeof(int)=4
s.i=-858993460
u.i=256
按照以上例子,s结构体所占用的内存结构为8个字节:
S结构体赋值后的内存结构为:
u结构所占用的内存结构为4个字节:
u结构体赋值后的内存结构为:
样是结构体,struct和union的差别就在于内存的分配。struct的内存分配是成员内存的总和,如s结构体一共占int+char[4]=4+4=8个字节。而union 只配置一个足够大的空间用来容纳最大长度的数据成员,也就是union最大占用内存的成员就是这个union结构体的最大内存。换句话说,这个union的内存是各个成员公用的,例如以上例子,u结构体的成员变量有int和char数组,长度分别为4,4。u占用的内存去成员变量的最大占用内存值,所以还是4个字节。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0
处开始,当给u的char数组赋值的时候,就从u的字节低位(基地址)开始分配。赋值后,在打印u.i的时候就是从联合体u获取i的值,根据union的规则,内存是公共的,也是从该联合体基地址的偏移量为0 处开始获取4个字节。根据u赋值后的内存结构当整数来处理就相当于256了。而s.i是没有赋值的,只能获取随机数。
总结:union的好处就是节省了内存空间,不过还是得看场合使用。
注意:系统的存储模式会直接影响union结构体的取值,例如大端模式和小端模式。
时间: 2024-10-11 22:09:40