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

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

3天内不再提示

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

哈哈hfgfdf 来源:嵌入式学习资料 作者:嵌入式学习资料 2024-01-11 18:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

结构体

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

a5a24e68-a9d0-11ee-9b10-92fbcf53809c.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("n%s---%lun",RecordInfo.SoftKey.Conferencekey,sizeof(CallRecordInfo));
return0;
}

4、结果

a5a9f38e-a9d0-11ee-9b10-92fbcf53809c.png

原文:https://blog.csdn.net/psr1999

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

审核编辑 黄宇

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

    关注

    1

    文章

    131

    浏览量

    11300
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    共用声明

    共用也称联合体。 和结构还是有点像: union 共用
    发表于 12-05 07:24

    中科曙光入选首批天津市卓越工程师培养联合体成员单位

    11月23日,天津市卓越工程师培养联合体成立仪式暨天津大学国家卓越工程师学院高质量建设发展会议在天津大学北洋园校区隆重举行。中科曙光作为联合体首批成员单位受邀出席,总裁助理杨鸿轩代表企业参会,与政府、高校及产业界代表共同见证联合体
    的头像 发表于 11-28 16:42 529次阅读

    C语言编程技巧

    一个成员是一个未知大小的数组,适用于动态分配内存并关联一个可变长度的数组。‌ ‌3、匿名结构联合体‌:C语言允许在
    发表于 11-27 06:46

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达
    发表于 11-25 07:48

    单片机启动&库函数的构成

    ,由C语言联合体结构的特性,内部的地址是基地址累加的,只需要一个寄存器累加固定的偏移量,就能把结构
    发表于 11-18 08:15

    C语言结构使用

    型的数据组合。 结构的声明与定义 结构的声明一般形式为: c struct 结构
    发表于 11-12 08:30

    开鸿智谷加入创新联合体,共推先进制造业与人力资源服务融合发展

    为深入贯彻人才强国与制造强国战略,助力构建现代化产业体系,湖南湘江新区正式启动“人力资源服务助力先进制造业高质量发展创新联合体”(以下简称“创新联合体”)建设工作,并于11月1日在长沙人力资源服务
    的头像 发表于 11-03 17:21 1071次阅读
    开鸿智谷加入创新<b class='flag-5'>联合体</b>,共推先进制造业与人力资源服务融合发展

    元萝卜破局智能养老:携联合体攻坚场景,以“心价比”升级情绪价值

    近日,在工业和信息化部、民政部联合推动的智能养老服务机器人结对攻关与场景应用试点工作背景下,商汤科技旗下家用机器人品牌“元萝卜”成功入选试点名录,并受邀加入由润泽牵头打造的“智能养老机器人创新联合体
    的头像 发表于 09-15 11:52 277次阅读
    元萝卜破局智能养老:携<b class='flag-5'>联合体</b>攻坚场景,以“心价比”升级情绪价值

    单片机c语言编程实例大全

    单片机c语言编程实例大全_18
    发表于 04-30 16:11 6次下载

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,
    的头像 发表于 04-29 18:49 1735次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    C语言结构联合体的深度解析:内存布局与应用场景

    在于对内存的极致操控。结构构建数据实体,联合体实现内存复用,二者的组合使用能创造出强大的数据结构。掌握它们的底层原理,配合内存分析工具(如Valgrind、GDB),将助你在嵌入式开
    发表于 04-08 09:18

    长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位

    3月22日,“长沙新一代信息技术产教联合体成立大会暨第一届理事会议”在湖南商务职业技术学院隆重启幕。会上,长沙新一代信息技术产教联合体正式成立,拓维信息当选理事长单位,拓维信息旗下开鸿智谷当选
    的头像 发表于 03-26 17:48 869次阅读
    长沙新一代信息技术产教<b class='flag-5'>联合体</b>正式成立,拓维信息当选理事长单位

    产教新篇|长沙新一代信息技术产教联合体扬帆启航!

    在深化现代教育体系建设的主轴推动下,我国职业教育正以市域产教联合体和行业产教融合共同体为双翼,构建起教育链、人才链与产业链、创新链深度融合的新格局。2025年3月22日,“长沙新一代信息技术产教
    的头像 发表于 03-24 18:09 758次阅读
    产教新篇|长沙新一代信息技术产教<b class='flag-5'>联合体</b>扬帆启航!

    全套C语言培训资料—PPT课件

    共用、位运算、文件 全套C语言培训资料,共427页,13个章节:C语言概述、程序的灵魂—算
    发表于 03-12 14:50

    商汤科技与多家厂商共同成立语料终端创新联合体

    近日,由中央广播电视总台、上海市人民政府共同主办的2024科创大会在上海落下帷幕。期间,商汤科技与上海库帕思科技有限公司、上海阡视科技有限公司、以及国产主流芯片等共19家厂商共同成立语料终端创新联合体
    的头像 发表于 12-16 13:46 1571次阅读