注册 登录
编程论坛 C++教室

求大神解释下关于共用体的一个疑惑

johnleelpf 发布于 2013-10-25 22:53, 497 次点击
#include "stdafx.h"
#include <iostream>
using namespace std;
union datatype
{
    double a;
    int    b;
}x,y;
void main()
{
    x.a=8;
    x.b=4;
    y.b=4;
    y.a=8;
    cout<<"x.a="<<x.a<<"  "<<"x.b="<<x.b<<endl;
    cout<<"y.a="<<y.a<<"  "<<"y.b="<<y.b<<endl;
    cout<<"the size of union is:"<<sizeof(datatype)<<endl;
    cout<<"the size of a is:"<<sizeof(double)<<endl;
    cout<<"the size of b is:"<<sizeof(int)<<endl;
    system("pause");
}

运行结果为:
    x.a=8  x.b=4
    y.a=8  y.b=0
the size of union is:8
the size of a is:8
the size of b is:4
看书上讲共用体在使用时,始终是最新的赋值冲刷掉前面的赋值,以最大的数据类型为其共用体大小。我自己验证了下,发现不同的赋值顺序会直接影响到最后数据是否被冲刷掉。就像上面x共用体,在先给double型的a赋值为8,再给int型的b赋值为4,按照书中所讲,最后整个共用体以后放的4为准,那里面就只有int的8,但实际输出时a仍然有值,并未被刷掉。这是为什么???
而在将两个类型的数据换顺序存放后,先放的int型4被后来的double型8冲刷掉,读取int型的b时只读取到double型a的前部分,显示为0.
5 回复
#2
Osiris92013-10-26 01:28
你理解错误...!不关结构体大小的事
#3
pauljames2013-10-26 20:33
把内存的数据按照字节打出来看看就清楚了
#4
yss282013-11-01 21:37
共用体的大小 = 其中最大项的大小。不会变来变去的
#5
johnleelpf2013-11-02 16:20
回复 2楼 Osiris9
我理解错误的话,那该如何理解,请指教~
#6
johnleelpf2013-11-02 16:22
回复 4楼 yss28
呵呵,我纠结的不是共用体的大小,而是结构体中数据冲刷的问题
1