问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-02 19:19

我来回答

5个回答

热心网友 时间:2022-06-26 07:13

一、结构体struct

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

二、联合体union

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

代码1:对比struct和union占用内存大小
[code]
#include<stdio.h>
//结构体
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<stdio.h>

//联合体
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<stdio.h>

//联合体
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<stdio.h>

//联合体
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<stdio.h>

//联合体
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

热心网友 时间:2022-06-26 07:13

结构体里定义的各种变量都有自己独立的内存空间,而联合体中定义的变量公用一块内存

热心网友 时间:2022-06-26 07:14

结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!很高兴能为你提供帮助

热心网友 时间:2022-06-26 07:14

结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!能采纳我的建议是我的荣幸,谢谢,祝你生活愉快!

热心网友 时间:2022-06-26 07:15

结构体就懒得说了,他的每个成员都有属于自己的存储空间。
联合体,他的每个成员共享同一块空间,空间具体有多大,全取决于尺寸最大最粗最硬的那位。
联合体举例。
typedef union
{
unsigned char i;
unsigned int x
}uniondef;
你会发现在实际物理存储空间里,x占据两个房间,i也占据一个房间,i占据的房间属于x,而且i占据房间的地址总是低地址(会不会是高地址?也是可以的,不过一般默认cpu采取大端模式,具体请自行度娘
我是从部分mcu的角度说明的,这里int才取16位。
结构体struct和联合体union(联合)有什么区别呢?

一、结构体struct 各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。二、联合体union 各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体...

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

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

C语言结构体struct和联合体的union使用说明,以及优缺点

C语言中,结构体struct和联合体union是两种自定义数据类型,它们在存储和组织数据上有所不同。结构体由独立的成员组成,每个成员有自己的存储空间,适合存储多个需要同时使用的数据;而联合体则共享内存,所有成员共用同一地址,适合存储只使用部分成员且需要节省空间的情况。结构体的优势在于它具有全面性,能...

结构体和联合体的区别

结构体和联合体的主要区别是:结构体内部数据时分开放的,而联合体所有数据是放在一个地址空间内,我们只能使用其中一个数据。在 C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构体将一组相关变量看作一个单元而...

哪个朋友用简单的话说说结构体和联合体的区别

Union和struct的根本区别在于前者声明的成员都是共用同一个内存地址的。而struct中的成员是顺序存储在内存中的。比如:union A{ int a;float b;};struct B{ int a;float b;} 那么A的大小就是float的大小,struct的大小是int+float的大小。Union总体来说就是为节省内存设定的。

C语言里面结构体与共同体是啥意思具体指的是什么

联合体(union)和结构体(struct)的区别 1. 联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量。联合说明和联合变量定义与结构十分相似。其形式为:union 联合名{ 数据类型 成员名;数据类型 成员名;...} 联合变量名;联合表示几个变量公用一个内存位置, 在不同的时间保存不...

typedef union与typedef struct这两个类型定义的区别是什么

struct 类型的内存分配是结合内部的所有变量大小和相关的,但不是简单的相加,从上面的例子就可以看出来, struct 类型的分配的内存大小是应该内部最大数据类型的整数倍,不足一倍的部分会自动补全成一倍大小,应该是编译器为了数据整齐,处理速度会快些把。 union 类型的内存分配,只是和联合体内的最大的...

c++中的结构体和联合体有什么区别

1. 区别 结构体是多个不同类型变量的组合,其占用的内存大小是所有变量大小的总和 联合体是多个不同类型变量的抽取,其占用内存的大小是联合体中最大的那个变量的大小 2. 解释 结构体中的多个变量同时存在,你可以给其中的每个变量分别赋值。任何一个变量被赋值不影响其他变量。你在需要使用时每个变量都...

结构体,枚举体,联合体的区别

简单说 1,他们都是C语言的一种数据类型。2,结构体和联合体可以含有多种数据类型,枚举只能含有一种基本数据类型,而且为整型。3,结构体和联合体所占的空间不同,结构体按照对其方式每个数据类型都是独立的数据空间,整个结构体所占的空间基本上可以等于或者大于每个独立数据空间的和。而联合体所有数据...

联合体和结构体的区别

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。在进行某些...

联合体union和struct union与struct的区别 c语言union和struct struct结构体类型 struct结构体程序 struct内嵌union union结构体 union有什么用 struct结构
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
移动公司的存费送费活动是不是一次交费,24个月不用交费了啊??? 在移动充话费送的手机 每个月会收28元的保底费还要15元套餐费 要是为... 什么品牌的指甲剪好用? 哪些品牌的美甲工具质量好? 桂林的山水,像老人,像巨象,像骆驼,奇峰罗列,形态万千。 照样子,填,快... 实木家具涂刷水性木器漆好吗 ...一座座拔地而起各不相连像老人像巨象像骆驼…仿写 仿写下面的一段话 ...不相连,像老人,像巨象,像骆驼,奇峰罗列,形状万千。仿写 药店老板必知丨药店效期产品快速动销解决方案 union和reunion的区别 PVC地板适合用在别墅里吗? 蓄电池铸板喷模的技巧 谁能帮我翻译一下有关植物的英文,明天中午能翻译完就行了。一下我会给出翻译的内容。 木材纤维粉碎机粉出来的物质有什么用 广州哪里可以买到木栓啊?或者软木粉之类的。我要用来做实验用的,,,要纯的,,,顺便问问软木是木栓质 软木的成型工艺有哪些? 软木是什么? 和女朋友第一次处女流血怎么办准备什么止完血先继续搞还是怎样 东台市后港教育软木粉厂怎么样? 软木和硬木的区别 加什么助剂能让pP制品缩小? 跟女的第一次应该怎么准备,我怕血弄到被子上 蓄电池铸焊脱模剂用的软木粉制作方法 怎样鉴别葡萄牙软木粉 请问跟老婆第一次时怎么可以防止血不流到床单上呢? 东台市振东软木粉厂怎么样? 蓄电池用软木粉的原料是什么? 请问软木粉怎样附着在钢磨具上? 第一次做 怎么把血不弄到床上 要用什么 窘迫的意思 窘迫是什么意思? 窘迫是什么意思 窘迫的意思是什么? 窘迫是什么意思啊? 窘迫是 什么 意思 窘迫的意思是 窘迫什么意思? DNF里的空白名字怎么打,要确实能用的。 “窘迫”的意思是什么?急知!!! “窘迫”是什么意思呢? 窘迫意思是什么 DNF游戏名空白怎么打出来? 窘迫的意思???快! DNF怎么打空白名字? “窘迫”是什么意思? 窘迫的是什么意思 窘迫与尴尬的区别 dnf的空白名字是咋起的 生计窘迫是啥意思?