c++中,结构体和联合体的区别

来源:互联网 发布:sql server 2012安装 编辑:程序博客网 时间:2024/05/29 21:16

在C++中,结构体和联合体操作很类似,那么,区别在哪里呢?首先看下面代码:

#include <iostream>using namespace std;struct more{    int a;    char b[30];    short c;}nn;union less{    char aa;    char bb[30];    char cc;}mm;void main(){       nn.a=1;    strcpy(nn.b,"look");    nn.c=2;    cout<<sizeof(nn.a)<<endl;    cout<<sizeof(nn.b)<<endl;    cout<<sizeof(nn.c)<<endl;    cout<<sizeof(nn)<<endl;    cout<<nn.a<<endl;    cout<<nn.b<<endl;    cout<<nn.c<<endl;    cout<<endl;    mm.aa=1;    strcpy(mm.bb,"look");    mm.cc='2';      cout<<sizeof(mm.aa)<<endl;    cout<<sizeof(mm.bb)<<endl;    cout<<sizeof(mm.cc)<<endl;    cout<<sizeof(mm)<<endl;    cout<<mm.aa<<endl;    cout<<mm.bb<<endl;    cout<<mm.cc<<endl;}

这些代码运行在vc++6.0中,可以直接复制过去实验,程序运行结果如下:
这里写图片描述
我们可以看到:
结构体nn可以正确存储数值和显示,而联合体mm却是存储了最后一次的赋值‘2’。可见,联合体中,能够访问的是最后一次被赋值的变量,因为联合体所有变量存储的首地址是相同的,最后一次赋值会把上一次的存储单元覆盖掉。

    cout<<sizeof(nn.a)<<endl;    cout<<sizeof(nn.b)<<endl;    cout<<sizeof(nn.c)<<endl;    cout<<sizeof(nn)<<endl;
上面代码是读取结构图nn的长度,结果为4,30,2,36,可见,int a占四字节,char b[30]占30字节,short c占2个字节,整个结构体占4+30+2=36字节。同理,再读取联合体mm的长度时:
    cout<<sizeof(mm.aa)<<endl;    cout<<sizeof(mm.bb)<<endl;    cout<<sizeof(mm.cc)<<endl;    cout<<sizeof(mm)<<endl;

结果为1,30,1,30,可见,char aa占1字节,char bb[30]占30字节,
char cc占1字节,联合体的长度是按照最长的变量所占的字节算,所以为30
可见,结构体和联合体的核心区别就是在存储类型上,结构体是申请了所有变量的存储空间,联合体是申请了最大变量的存储空间。
但是,这里有个问题,关于字节对其的问题。
在32位系统中,char类型的对齐要求最小,只要1字节。
short的要2字节,int和float4字节,double最大需要8字节。
我们修改代码如下:

#include <iostream>using namespace std;struct more{    int a;    char b[30];    double c;}nn;union less{    int aa;    char bb[30];    short cc;}mm;void main(){       nn.a=1;    strcpy(nn.b,"look");    nn.c=2;    cout<<sizeof(nn.a)<<endl;    cout<<sizeof(nn.b)<<endl;    cout<<sizeof(nn.c)<<endl;    cout<<sizeof(nn)<<endl;    cout<<nn.a<<endl;    cout<<nn.b<<endl;    cout<<nn.c<<endl;    cout<<endl;    mm.aa=1;    strcpy(mm.bb,"look");    mm.cc='2';      cout<<sizeof(mm.aa)<<endl;    cout<<sizeof(mm.bb)<<endl;    cout<<sizeof(mm.cc)<<endl;    cout<<sizeof(mm)<<endl;    cout<<mm.aa<<endl;    cout<<mm.bb<<endl;    cout<<mm.cc<<endl;}

改变下数据类型,程序运行结果如下:
这里写图片描述
我们发现,结构体应该是4+30+8=42长度,但实际是48,这是因为double占8字节,内存要为大于42字节的做小的8的整数倍的数,6*8=48。那么联合体也是如此道理啦。

0 0