结构体
结构体占用的内存大小,首先和编译器的系统位数有关系,类似于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("n%s---%lun",RecordInfo.SoftKey.Conferencekey,sizeof(CallRecordInfo));
return0;
}
4、结果

原文:https://blog.csdn.net/psr1999
文章来源于网络,版权归原作者所有,如有侵权,请联系删除。
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
结构体
+关注
关注
1文章
131浏览量
11300
发布评论请先 登录
相关推荐
热点推荐
中科曙光入选首批天津市卓越工程师培养联合体成员单位
11月23日,天津市卓越工程师培养联合体成立仪式暨天津大学国家卓越工程师学院高质量建设发展会议在天津大学北洋园校区隆重举行。中科曙光作为联合体首批成员单位受邀出席,总裁助理杨鸿轩代表企业参会,与政府、高校及产业界代表共同见证联合体
开鸿智谷加入创新联合体,共推先进制造业与人力资源服务融合发展
为深入贯彻人才强国与制造强国战略,助力构建现代化产业体系,湖南湘江新区正式启动“人力资源服务助力先进制造业高质量发展创新联合体”(以下简称“创新联合体”)建设工作,并于11月1日在长沙人力资源服务
元萝卜破局智能养老:携联合体攻坚场景,以“心价比”升级情绪价值
近日,在工业和信息化部、民政部联合推动的智能养老服务机器人结对攻关与场景应用试点工作背景下,商汤科技旗下家用机器人品牌“元萝卜”成功入选试点名录,并受邀加入由润泽牵头打造的“智能养老机器人创新联合体
C语言中结构体与联合体的深度解析:内存布局与应用场景
在于对内存的极致操控。结构体构建数据实体,联合体实现内存复用,二者的组合使用能创造出强大的数据结构。掌握它们的底层原理,配合内存分析工具(如Valgrind、GDB),将助你在嵌入式开
发表于 04-08 09:18
长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位
3月22日,“长沙新一代信息技术产教联合体成立大会暨第一届理事会议”在湖南商务职业技术学院隆重启幕。会上,长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位,拓维信息旗下开鸿智谷当选
产教新篇|长沙新一代信息技术产教联合体扬帆启航!
在深化现代教育体系建设的主轴推动下,我国职业教育正以市域产教联合体和行业产教融合共同体为双翼,构建起教育链、人才链与产业链、创新链深度融合的新格局。2025年3月22日,“长沙新一代信息技术产教
商汤科技与多家厂商共同成立语料终端创新联合体
近日,由中央广播电视总台、上海市人民政府共同主办的2024科创大会在上海落下帷幕。期间,商汤科技与上海库帕思科技有限公司、上海阡视科技有限公司、以及国产主流芯片等共19家厂商共同成立语料终端创新联合体

经典 C 语言编程,结构体和联合体如何共用?
评论