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’