0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个经典的结构体和联合体共用实例

工程师进阶笔记 来源:CSDN技术社区 2023-05-04 11:49 次阅读

结构体

结构体占用的内存大小,首先和编译器的系统位数有关系,类似于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 的机器)

9284f1a2-e79b-11ed-ab56-dac502259ad0.png

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、结果

92920694-e79b-11ed-ab56-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10802

    浏览量

    210771
  • Linux
    +关注

    关注

    87

    文章

    11202

    浏览量

    208693
  • 内存
    +关注

    关注

    8

    文章

    2964

    浏览量

    73803
  • 编译器
    +关注

    关注

    1

    文章

    1616

    浏览量

    49011
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10823

原文标题:一个经典的结构体和联合体共用实例

文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    430编程C语言常识(IAR)之结构联合体

    ,aa.d地址为N+1,是奇数地址,因为430在奇数地址只能读取一个字节,因此要访问d成员需要读取两次才能完成,后果是代码变长、速度变慢。  三. 匿名结构
    发表于 11-22 15:43

    DLL导入结构 联合体

    DLL函数参数中,有结构联合体结构中使用联合体,这种方式的函数怎么使用LABVIEW导入
    发表于 09-06 10:32

    联合体问题

    union U1{INT8Uax[4];FP32 fx;INT32Slx;INT32Uulx;INT16Six;INT16Uuix;INT8Scx;INT8Uucx;};U1 X_rom;//申请联合接口数据变量定义如上的
    发表于 01-04 12:13

    如何定义了这个联合体

    我先定义联合体数据类型,然后接着定义了联合体变量,定义联合体部分如下:我在sys_con
    发表于 07-12 04:28

    为什么位域结构联合体起使用?

    /*本例程是C语言的位域操作示例这里为什么位域结构联合体起使用?-->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据主要应用:单片机C语言好处:用标志位可以节省R
    发表于 07-14 06:23

    结构共用的区别

    语言中,还有另外种和结构非常类似的语法,叫做共用(Union),它的定义格式为:union 共用
    发表于 07-20 06:57

    结构联合体的区别到底在哪里

    在单片机软件编程中,结构和枚举类型都很常用到,联合体相对来用的就比较少。那么结构联合体的区
    发表于 11-22 07:54

    如何利用联合体去判断大小端呢

    转载,如若侵权,请联系本人删除。联合体定义联合体结构样都是自定义类型。联合体也包含
    发表于 12-15 07:21

    联合体/共用的使用方法

    大家好,我是ZhengN。本次给分享联合体些知识。联合体/共用的使用 C语言中,联合体/
    发表于 02-28 10:05

    结构struct和联合体union的区别?

    结构struct和联合体union的区别?
    发表于 10-11 08:21

    C语言:结构联合体嵌套使用的实用操作

    。 定义联合类型的般形式为: 成员表中含有若干成员,成员的般形式为:类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节
    的头像 发表于 12-24 16:07 5426次阅读
    C语言:<b class='flag-5'>结构</b><b class='flag-5'>体</b>、<b class='flag-5'>联合体</b>嵌套使用的实用操作

    什么是C语言的联合体

    名{ 成员列表 }; 共用有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构
    的头像 发表于 07-29 15:35 3664次阅读
    什么是C语言的<b class='flag-5'>联合体</b>

    关于数字硬件建模SystemVerilog联合体

    联合体可以有多个数据类型表示的单个存储元素,联合体的声明类似结构,但推断出的硬件非常不同
    的头像 发表于 07-07 09:05 949次阅读

    c语言中结构联合体的区别

    结构联合体是C语言中的构造类型,结构我们平时应该都用得很多。但是,对于联合体
    的头像 发表于 12-03 14:25 2448次阅读
    c语言中<b class='flag-5'>结构</b><b class='flag-5'>体</b>有<b class='flag-5'>联合体</b>的区别

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

    中可以 使用 sizeof 进行获取,默认为字节对齐的大小。 联合体 联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。
    的头像 发表于 01-11 18:24 1223次阅读
    <b class='flag-5'>经典</b> C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和<b class='flag-5'>联合体</b>如何<b class='flag-5'>共用</b>?