关于union的基本概念和大小计算不再赘述,只重点提示一下,使用union的时候一定要注意初始化、初始化、初始化...重要的事情说三遍。初始化的方法可以直接初始化union中最长数据,也可以和struct一样使用ZeroMemory(this, sizeof(type_union));。
首先,从实用角度分析,不关注内存存储。假设有一个union定义如下:
typedef union u_test
{
char sztest;
int count;
u_test()
{
ZeroMemery(this, sizeof(u_test));
}
}ut;
当我们使用,
int main()
{
ut.sztest = 0x01;
printf("%02x", ut.count);
return 0;
}
从union的内存对齐上来看,union是从低位开始对齐的,那么ut.count此时应该是0x01000000,还是0x00000001呢?经过实际验证答案是后者,也就是说int整形输出时,系统会从前四字节自动从低位开始填充整形内存然后输出,即0x00000001.
同理,当我们定义一个IP地址转化的union时,可以使用如下方法:
typedef union u_ipaddress
{
BYTE ipaddr[4];
DWORD dwip;
u_test()
{