结构体
结构体占用的内存大小,首先和编译器的系统位数有关系,类似于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文章
11099浏览量
217754 -
Linux
+关注
关注
87文章
11522浏览量
214380 -
内存
+关注
关注
8文章
3128浏览量
75375 -
编译器
+关注
关注
1文章
1663浏览量
50362 -
结构体
+关注
关注
1文章
131浏览量
11142
原文标题:一个经典的结构体和联合体共用实例
文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
C语言中结构体与联合体的深度解析:内存布局与应用场景
430编程C语言常识(IAR)之结构体与联合体
联合体问题
为什么位域结构体与联合体一起使用?
经典 C 语言编程,结构体和联合体如何共用?

评论