关于#c++#的问题:c/c++ 中联合体的用法

c/c++ 中联合体的用法

img


union共用同一块内存,所以输出的num.n不应该是65吗?
如果改正的话,应当怎么改正呢?

联合体就是将几种不同数据类型的成员变量存放到同一段内存单元中,当对联合体较小的成员变量赋值时,不会销毁或初始化未涉及到内存区域,但会改变相互重叠的部分。如果需要给联合体成员变量赋值,因为它们共用同一个内存空间,故而,不需要将每个成员变量都赋值,用到哪个赋值哪个,因为几个成员变量间是互相覆盖的。供参考:

#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只能初始化一个字节,还有三个字节没有初始化导致的?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这个问题可能是由于对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()直接终止程序。

    代码优化后的完整代码如下:

    ```

    include

    include

    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&
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^