Union的一个知识点

union是大家比较熟悉的一个数据类型,假设有:


union Ut

{

short  sh;

char  ch;

};

假设有如下执行代码

void main()

{

Ut  t;                // 1

t.sh = 0x1000; // 2

t.ch = 0x01;     // 3

}

如果是小端机器上,那么 代码执行完代码 2 处,t 对象的 变量的内存为:00 10,图示1如下

执行完代码 3 处后, t 对象的内存为图2所示:

t.ch = 0x01 ,就是红色的 01, 仅覆盖了原有的 00


内存却不是:01 00,(t.ch只能够操作一个字节的空间)


总结:一直以为,union的确是按最大的成员变量来开辟内存空间,但是只存放一个成员的值,以该程序为例,执行 t.sh = 0x1000;内存如图1所示。

但是执行 t.ch = 0x01后,以前的理解是会将内存先清空,再保存 t.ch的值,该是 01 00,但实际却是图2所示的 01 10 ,执行完代码3处,t.ch只是改变自己的一个字节,内存中的其他位置不作处理,只是保存自己的一个字节 01,后面的 10未操作。