结构体
结构体占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,结构体需要考虑字节对齐的问题。实际上占用的内存大小, 在 Linux 中可以 使用 sizeof 进行获取,默认为字节对齐的大小。
联合体
联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。
结构体和联合体连用例子:1、首先定义一个结构体,内部包含联合体,如下;
#defineMAX_SOFTKEY_LEN4
typedefenum
{
ENUM_TRANSFER,
ENUM_CONFERENCE,
ENUM_ANSWER,
ENUM_HOLD,
}KeyType;
typedefstructtag_CallRecordInfo
{
charline;//currentrecordingline.
unsignedcharstate;//currentmachinestate.
unsignedshorttotal;//currenttotalusedlines.
KeyTypetype;
union
{
charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer
charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer
charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer
charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer
}SoftKey;
}CallRecordInfo;
解释如下结构体:
联合体union表示公用一个4字节的内存,并且定义了一个联合体变量SoftKey,这个 联合体最大的好处就是在赋值或者清空时能够直观地清楚,不需要再引用联 合体的参数。如: CallRecordInfoinfo; 对 info.SoftKey 的操作会影响联合体内部参数的值,并且数值一致。也 就是说,我们只要对info.SoftKey进行赋值即可,然后联合体内的参 数内容是一样的。即: info.SoftKey=info.SoftKey.TransferKey.
2、结构体占用的内存大小(作者的机器为 Ubuntu 18.04, sizeof(int) = 4 的机器)

3、整体代码
#include#include #include #defineMAX_SOFTKEY_LEN4 typedefenum { ENUM_TRANSFER, ENUM_CONFERENCE, ENUM_ANSWER, ENUM_HOLD, }KeyType; typedefstructtag_CallRecordInfo { charline;//currentrecordingline. unsignedcharstate;//currentmachinestate. unsignedshorttotal;//currenttotalusedlines. KeyTypetype; union { charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer }SoftKey; }CallRecordInfo; CallRecordInfoRecordInfo; voidSetSoftKeyValue(intstate,KeyTypetype,char*keybuf) { RecordInfo.state=state; RecordInfo.type=type; memset(&RecordInfo.SoftKey,0,MAX_SOFTKEY_LEN); if(NULL!=keybuf) { memcpy(&RecordInfo.SoftKey,keybuf,MAX_SOFTKEY_LEN); } } intmain(intargc,charconst*argv[]) { charbuf[4]="123"; SetSoftKeyValue(0,ENUM_TRANSFER,buf); printf(" %s---%lu ",RecordInfo.SoftKey.Conferencekey,sizeof(CallRecordInfo)); return0; }
4、结果

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
cpu
+关注
关注
68文章
11378浏览量
226489 -
Linux
+关注
关注
88文章
11868浏览量
219897 -
内存
+关注
关注
9文章
3262浏览量
76608 -
编译器
+关注
关注
1文章
1673浏览量
52099 -
结构体
+关注
关注
1文章
131浏览量
11430
原文标题:一个经典的结构体和联合体共用实例
文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
一个经典的结构体和联合体共用的实例
Linux 中可以 使用 sizeof 进行获取,默认为字节对齐的大小。
联合体
联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存
发表于 12-16 07:14
430编程C语言常识(IAR)之结构体与联合体
,aa.d地址为N+1,是个奇数地址,因为430在奇数地址只能读取一个字节,因此要访问d成员需要读取两次才能完成,后果是代码变长、速度变慢。 三. 匿名结构体与
发表于 11-22 15:43
联合体问题
union U1{INT8Uax[4];FP32 fx;INT32Slx;INT32Uulx;INT16Six;INT16Uuix;INT8Scx;INT8Uucx;};U1 X_rom;//申请联合接口体数据变量定义如上的一
发表于 01-04 12:13
为什么位域结构体与联合体一起使用?
/*本例程是C语言的位域操作示例这里为什么位域结构体与联合体一起使用?-->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据主要应用:单片机C语言好处:用标志位可以节省R
发表于 07-14 06:23
经典 C 语言编程,结构体和联合体如何共用?
中可以 使用 sizeof 进行获取,默认为字节对齐的大小。 联合体 联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。
一个经典的结构体和联合体共用实例
评论