c/c++ 中联合体的用法
联合体就是将几种不同数据类型的成员变量存放到同一段内存单元中,当对联合体较小的成员变量赋值时,不会销毁或初始化未涉及到内存区域,但会改变相互重叠的部分。如果需要给联合体成员变量赋值,因为它们共用同一个内存空间,故而,不需要将每个成员变量都赋值,用到哪个赋值哪个,因为几个成员变量间是互相覆盖的。供参考:
#include <stdio.h>
union temp{
int n;
char ch;
};
int main()
{
temp num;
num.n = 0x7fffffff;
printf("%X\n", num.n);
num.ch = 'A';
printf("%X,num.ch:%c", num.n, num.ch);
return 0;
}
是不是因为char只能初始化一个字节,还有三个字节没有初始化导致的?
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题可能是由于对union的理解不全导致的。union是让多个变量共用同一块内存,但在任意时刻只可以按照一个数据类型对共用体进行赋值,共用体中这些成员的关系是“或”,即“不是你死就是我活”,在输出时需要根据定义好的数据类型输出。
现在我们来看一下代码的问题所在,首先union定义得没问题,但在输入数据时,没有考虑到输入数据类型,并在无效输入时并没有进行提示,这可能就导致了union的输出不正确。
因此,我们需要在输入数据的时候进行类型检测,以保证输入的数据类型正确。代码如下:
istream& operator >> (istream& cin, MumberInfor& Object)
{
cout << "请输入成员类别(t:teacher;s:student):";
cin >> Object.Kind;
if (typeid(Object.Kind).name() == "char" && Object.Kind != 't' && Object.Kind != 's') // 将输入数据类型的判断纳入非法检测当中
{
cout << "输入成员类别非法" << endl;
exit(-1); // 看见错误代码为-1就知道输入类别非法
}
if (Object.Kind == 't')
{
cout << "请输入老师性别(f:女;m:男):";
cin >> Object.infor.sex;
if (typeid(Object.infor.sex).name() == "char" && Object.infor.sex != 'f' && Object.infor.sex != 'm') // 将输入数据类型的判断纳入非法检测当中
{
cout << "输入老师性别非法" << endl;
exit(-2); // 看见错误代码为-2就知道输入性别非法
}
}
else if (Object.Kind == 's')
{
cout << "请输入学生学号(整型变量):";
cin >> Object.infor.StudNum;
}
return cin;
}
其中,我们使用了typeid()方法获取输入数据的类型,并进行比较。在非法输入时,使用exit()直接终止程序。
代码优化后的完整代码如下:
```
using namespace std;
union sub_infor { char sex; int StudNum; };
struct MumberInfor { union sub_infor infor; char Kind; struct MumberInfor* M_infor;
friend istream& operator >> (istream& cin, MumberInfor& Object);
friend ostream& operator << (ostream&