union中有struct的情况-从内存分析

union中的每个成员共用一块内存,且首地址相同;
这块内存必须大于等于union中最大成员的字节数。

举个例子:
union U中有两个成员,
一个是int型的a,4个字节;
一个是结构体STU,考虑对齐,16个字节。

struct STU {
	int b;
	long long c;
};

union U{
	int a;
	STU stu;
};

首先使用结构体初始化union U,查看其内存分布情况:

U u;
	STU m_stu;
	m_stu.b = 6;
	m_stu.c = 66;

	u.stu = m_stu;
	cout << "struct 中 (int)b=" << u.stu.b << " (long)c=" << u.stu.c << endl;

内存分布情况如下图,union的初始地址是0x007CF9E8,分配了16个字节的内存;
前面4个字节存放成员(int)b,后面四个字节是对齐的4个字节;
再往后面8个字节的内存存放(long long)c;
所以b=6;c=66;
在这里插入图片描述
下面用union另一个成员(int)a来初始化union U;

u.a = INT_MAX;
	cout << "(int)a=" << u.a << endl;
	cout << "struct 中 (int)b=" << u.stu.b << " (long)c=" << u.stu.c << endl;  

内存中的情况如下图
在这里插入图片描述
所以输出为:
在这里插入图片描述


下面做一个测试,考虑以下代码
现在union中两个成员,结构体STU类型的stu和int型的a都为4个字节;
我们先初始化stu的四个成员为字符’a’,那么查看stu的四个字符成员,自然都是’a’;
接下来我们将使用union U中的a成员,初始化为1111638594,即16进制的 42 42 42 42,而字符’B’的ascii码为42(16进制),那么这个时候假如我们去输出结构体的4个成员,它会是什么呢?结果在下面。

struct STU {
	char ch1;
	char ch2;
	char ch3;
	char ch4;
};

union U{
	int a;
	STU stu;
};

int main() {
	U u;
	STU m_stu;
	m_stu.ch1 = 'a'; //ascii为97,即16进制61
	m_stu.ch2 = 'a';
	m_stu.ch3 = 'a';
	m_stu.ch4 = 'a';

	u.stu = m_stu;
	cout << "struct 中 (char)ch1=" << u.stu.ch1 
		<< " (char)ch2=" << u.stu.ch2 
		<< " (char)ch3=" << u.stu.ch3
		<< " (char)ch4=" << u.stu.ch4
		<< endl;

	u.a = 1111638594;//16进制为 42 42 42 42 ,ascii为42对应的字符是B
	cout << "(int)a=" << u.a << endl;
	cout << "struct 中 (char)ch1=" << u.stu.ch1
		<< " (char)ch2=" << u.stu.ch2
		<< " (char)ch3=" << u.stu.ch3
		<< " (char)ch4=" << u.stu.ch4
		<< endl;
}

根据上面的分析,我们不难分析出,这时候输出结构体的4个成员,都是字符‘B’
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值