union联合体使用注意事项

时间:2022-09-05 18:29:27

union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。

union{
int a;
long long b;
unsigned char c[20];
} myUnion;

关于union占用的的内存大小:

1)大小足够容纳最宽的成员;
2)大小能被其包含的所有基本数据类型的大小所整除。

所以对于sizeof(myUnion),结果为24,而不是20.

举例使用union判断系统是大端模式还是小端模式

这里需要考虑存储模式:大端模式和小端模式。

  1. 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
  2. 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
先分析一下,按照上面关于大小端模式的定义,假设int 类型变量i 被初始化为1。
以大端模式存储,其内存布局如下图:
union联合体使用注意事项
以小端模式存储,其内存布局如下图:
union联合体使用注意事项

变量i 占4 个字节,但只有一个字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。既然如此,我们完全可以利用union 类型数据的特点:所有成员的起始地址一致。

int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}