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

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

3天内不再提示

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

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-03 14:25 次阅读

结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。我们先来简单看一下联合体:

union 联合名
{
成员表
};

成员表中含有若干成员,成员的一般形式为:类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节数。

下面用代码进行理解:

enum DATA_PKG_TYPE
{
    DATA_PKG1 = 1,
    DATA_PKG2,
    DATA_PKG3    
};

struct data_pkg1
{
    // ...
};

struct data_pkg2
{
    // ...
};

struct data_pkg3
{
    // ...
};

struct data_pkg
{
    enum DATA_PKG_TYPE data_pkg_type;
    union 
    {
       struct data_pkg1 data_pkg1_info;
       struct data_pkg2 data_pkg2_info;
       struct data_pkg3 data_pkg3_info;
    }data_pkg_info;
};

把struct data_pkg1、struct data_pkg2、struct data_pkg3三个结构体放到了struct data_pkg这个结构体里进行管理,把data_pkg_type与union里的三个结构体建立一一对应关系,我们需要用哪一结构体数据就通过data_pkg_type来进行选中。

在进行数据组包的时候,先给data_pkg_type进行赋值,确定数据包的类型,再给对应的union里的结构体进行赋值;在进行数据解析的时候,通过data_pkg_type来选择解析哪一组数据。

poYBAGOJ98iAQ1WEAAEwqauSLcU443.png

结构体部分:

#define BUF_SIZE 16
union protocol_data
{
 uint8_t data_buffer[BUF_SIZE];
 struct 
 {
  uint8_t data1;
  uint8_t data2;
  uint8_t data3;
  uint8_t data4;
  // ...
 }data_info;
};

struct里面的内容可以设计得很简单,比如全是有用的数据,或是设计得很复杂,包含一些协议头尾、包长、有效数据、校验等内容。

但无论如何,我们组包发送的过程是填充结构体->发送data_buffer;反之接收数据解析的过程就是接收数据存于data_buffer->使用结构体数据

审核编辑:汤梓红

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

    关注

    8

    文章

    3009

    浏览量

    73942
  • C语言
    +关注

    关注

    180

    文章

    7602

    浏览量

    136469
  • 结构体
    +关注

    关注

    1

    文章

    130

    浏览量

    10839
收藏 人收藏

    评论

    相关推荐

    C语言联合体的巧妙运用

    联合体(Union)是C语言中的一种复合类型,它允许在同一内存区域存储多个不同的数据类型的成员(member),但只能同时存在其中一个成员。
    发表于 06-21 10:59 1829次阅读

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

      结构联合体C语言的常见数据类型,可对C的基本数据类型进行组合使之能表示复杂的数据
    发表于 11-22 15:43

    DLL导入结构 联合体

    DLL函数参数中,结构联合体结构中使用联合体
    发表于 09-06 10:32

    联合体问题

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

    如何定义了这个联合体

    我先定义一个联合体数据类型,然后接着定义了一些联合体变量,定义联合体部分如下:我在sys_config.c文件中定义如下联合体数据类型和变量
    发表于 07-12 04:28

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

    /*本例程是C语言的位域操作示例这里为什么位域结构联合体一起使用?-->因为这样定义后,即可以单独使用标志位 也可同时使用整个字节数据主
    发表于 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语言结构联合体嵌套使用的实用操作

      结构联合体C语言中的构造类型,结构我们平
    的头像 发表于 12-24 16:07 5473次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>结构</b><b class='flag-5'>体</b>、<b class='flag-5'>联合体</b>嵌套使用的实用操作

    什么是C语言联合体

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

    看一下结构联合体结合使用在C语言与嵌入式中的一些实用技巧

    结构联合体C语言中的构造类型,结构我们平时应
    发表于 05-08 10:19 4248次阅读
    看一下<b class='flag-5'>结构</b><b class='flag-5'>体</b>、<b class='flag-5'>联合体</b>结合使用在<b class='flag-5'>C</b><b class='flag-5'>语言</b>与嵌入式中的一些实用技巧

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

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