struct和union的区别,union和struct嵌套

http://www.itjxue.com  2023-01-16 00:34  来源:未知  点击次数: 

结构体struct和联合体union(联合)有什么区别呢

一、结构体struct

各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。

二、联合体union

各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。

代码1:对比struct和union占用内存大小

[code]

#include

//结构体

struct u //u表示结构体类型名

{

char a; //a表示结构体成员名

int b;

short c;

}U1;

//U1表示结构体变量名

//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符

//联合体

union u1 //u1表示联合体类型名

{

char a; //a表示联合体成员名

int b;

short c;

}U2;

//U2表示联合体变量名

//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符

//主函数

int main(){

printf("%d\n",sizeof(U1));

printf("%d\n",sizeof(U2));

return 0;

}

/*程序运行结果是:

12

4*/

[/code]

所有成员共用一块存储空间,在操作不同的成员时,编译器根据不同的成员类型,按照不同的方式取值。

#include

//联合体

union u1

{

char a;

int b;

short c;

}U2;

//主函数

int main(){

U2.a='a';

printf("%c%c\n",U2.b,U2.c);//输出aa

U2.a='b';

printf("%c%c\n",U2.b,U2.c);//输出bb

U2.b=0x4241;

printf("%c%c\n",U2.a,U2.c);//输出AA

return 0;

}

代码3:union大小计算

union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍

代码中U3至少容纳最大e[5]=20字节,同时变量类型最大值是整数倍,即使double(字节数是8)的整数倍,因而sizeof(U3)=24。

#include

//联合体

union u2

{

char a;

int b;

short c;

double d;

int e[5];

}U3;

//主函数

int main(){

printf("%d\n",sizeof(U3));//输出24

return 0;

}

代码4:union大小端模式

#include

//联合体

union u3

{

char c[4];

int i;

}U4;

//主函数

int main(){

U4.C[0]=0X04;

U4.C[1]=0X03;

U4.C[2]=0X02;

U4.C[3]=0X11;

printf("%x\n",U4.i);//输出为11020304 小端

return 0;

}

代码5:struct字节对齐

U5中a四个字节,后面b和c加起来3个字节,正好补1个字节对齐;U6中b1个字节,要和后面的a对齐,需要补3个字节对齐,c也要补1个字节对齐,因而最终U6为12个字节。另外,要想改变这种默认对齐设置,可以用

#pragma pack (2) /*指定按2字节对齐*/

#pragma pack () /*取消指定对齐,恢复缺省对齐*/

#include

//联合体

struct u4

{

int a;

char b;

short c;

}U5;

struct u5

{

char b;

int a;

short c;

}U6;

//主函数

int main(){

printf("%d\n",sizeof(U5));

printf("%d\n",sizeof(U6));

return 0;

}

//输出为

//8

//12

结构体struct与联合体union的区别

struct的成员各自有自己的内存空间,各自使用互不干涉,一个struct变量的总长度不小于所有成员的长度之和,由于遵循内存对齐原则总长度可能会变大。

union各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。

造成以上差异的原因是union的所有成员共用一块内存,一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍,char1个字节,int4个字节,short2个字节,所以该union所占内存空间大小为4个字节(测试平台是32位,下同)。

union大小计算准则:1、至少要容纳最大的成员变量 ;2、必须是所有成员变量类型大小的整数倍。

至少容纳最大e[5]为4*5字节,同时是所有成员变量类型大小的整数倍,double8字节整数倍,因此该联合体占内存24字节。

pragma pack (2) 指定按2字节对齐

pragma pack () 取消指定对齐,恢复缺省对齐

结构体(struct)和联合体(union)的区别

C语言的结构体和共同体的区别是什么?

结构体(structure)是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型,而且每个成员的数据类型可以相同也可以不相同。共同体(union)将几种不同的变量储存在同一内存单元中,也就是使用覆盖技术,几个变量互相覆盖,这种几个不同的变量共同占用一段内存的结构,可见二者最大的区别就是所占用的内存,结构体(structure)所占用的内存是分量内存之和,共同体(union)所占用的内存是等于最大的分量的内存。

具体来说,结构体(structure)与共同体(union)主要有以下区别:

1.结构体(structure)与共同体(union)都是由多个不同的数据类型成员组成,

但在任何同一时刻,

共同体(union)中只存放了一个被选中的成员,

而结构体(structure)的所有成员都存在。在结构体(structure)中,各成员都占有自己的内存空间,它们是同时存在的。一个结构体(structure)变量的总长度等于所有成员长度之和。在共同体(union)中,所有成员不能同时占用它的内存空间,它们不能同时存在。共同体(union)变量的长度等于最长的成员的长度。

2.

对于共同体(union)的不同成员赋值,

将会对其它成员重写,

原来成员的值就不存在了,

而对于结构体(structure)的不同成员赋值是互不影响的。

结构体和联合体的区别

结构体和联合体的主要区别是:结构体内部数据时分开放的,而联合体所有数据是放在一个地址空间内,我们只能使用其中一个数据。

在 C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。

共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。

简单地说,我们可以把“结构体类型”和“结构体变量”理解为是面向对象语言中“类”和“对象”的概念。

class \ struct \ union 中有什么区别吗?

class 是C++里的,我没学过;

struct与union的区别是struct可以允许多个成员同时存在,而union则只能允许一个成员存在,别且union中所有成员公用一个地址,相比struct则不同的成员有自己的地址

c语言中struct与union有什么区别

在存储多个成员信息时,编译器会自动给struct的每个成员分配存储空间,所以struct可以存储多个成员信息,而union的每个成员都用同一个存储空间。对union的不同成员赋值,将会对其他成员重写,这些成员原来的值就不存在了,而对struct的不同成员进行赋值是互不影响的。

(责任编辑:IT教学网)

更多

推荐微软认证文章