本文共 483 字,大约阅读时间需要 1 分钟。
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未操作。