当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:

柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:

本篇文章我们就来一起学习柔性数组。

什么是柔性数组?

C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组

柔性数组的特点:

  • 结构体中柔性数组成员前面必须至少有一个其他成员。
  • sizeof返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc()函数进行内存的动态分配。

例子:

// 微信公众号:嵌入式大杂烩 #include   #include  #include  typedef struct _data { int len; char val[];
}data_t; int main(int arc, char *argv[]) { data_t test_data1 = {0}; printf("sizeof(data_t) = %ld\n", sizeof(data_t)); char *src_data = "hello flexible arr"; // 为结构体及其柔性数组成员申请一块连续的空间 int len = strlen(src_data) + 1; data_t *p_test_data2 =(data_t*)malloc(sizeof(data_t) + sizeof(char) * len); if (NULL == p_test_data2)
    { printf("malloc p_test_data2 error\n"); return EXIT_FAILURE;
    } // 填充结构体 p_test_data2->len = len; strncpy(p_test_data2->val, src_data, p_test_data2->len); printf("p_test_data2->val = %s\n", p_test_data2->val); // 释放内存 free(p_test_data2);
    p_test_data2 = NULL; return 0;
}

编译、运行:

下面我们一起通过实例来认识柔性数组的优点。

柔性数组与指针的区别?

上一节的协议格式结构体其实可以又如下两种创建方式:

  • value字段以柔性数组的方式定义:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t value[];
}protocol_format_t;
  • value字段以指针的方式定义:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t *value;
}protocol_format_t;

(1)结构体占用空间

柔性数组的方式结构体占用较指针的方式少。

柔性数组方式:

指针方式:

(2)代码简洁及访问速度方面

柔性数组的方式相对与指针的方式更为简洁,柔性数组的方式只需要申请一次空间,给结构体申请空间的同时也给柔性数组申请空间;而指针的方式,除了给结构体申请空间之外,还得给结构体里的指针成员申请空间。

柔性数组方式:

指针方式:

使用指针的方式写代码会比柔性数组的方式会繁琐一些,特别地,如果在释放内存的时候把顺序弄反了,则结构体里的指针成员所指向的内存就释放不掉,会造成内存泄露。

柔性数组的方式只需要申请一次空间,是一块连续的空间;而指针的方式,申请的两块空间不是连续的。连续的内存有益于提高访问速度。

当然,前面介绍柔性数组的时候有说到,柔性数组是在C99标准及之后才有的,如果你的编译器还是比较古老的,那还是选用指针的方式,通用性也会比较好。

以上就是本次的分享,期待你的点赞、收藏、转发!

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。

猜你喜欢:

分享一种灵活性很高的协议格式(附代码例子)

嵌入式大杂烩周记 | 第 15 期

访问非法内存为什么不会出错?

嵌入式大杂烩周记 | 第 14 期

分享几个实用的代码片段(第二弹)

分享一种你可能不知道的bug定位方法

分享一种修改配置文件的方法

《嵌入式大杂烩周记第 13 期:lz4》

《嵌入式并行多线程处理器,了解一下!》

《分享一种修改配置文件的方法》

《分享几个实用的代码片段(附代码例子)》

《废旧板子再利用:搭建无线调试环境!》

《嵌入式段错误的3种调试方法汇总!》

《简说TCP通信非阻塞接收(附代码例子)》

《TCP通信常用接口的使用封装》

《写国际化的嵌入式代码,时间问题如何处理?》

《Linux命令行万能解压命令》

《嵌入式软件中,总线错误的坑?替大家先踩一步》

《分享嵌入式软件调试方法及几个有用的工具!》

《分享两点提高编程能力的建议!》


在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

业内消息,近日东芝正在计划在日本裁员5000名员工,相当于日本员工总数的7%左右,这是其加速重组的最新举措。据知情人士透露,裁员的主要对象是总部的后勤部门,同时该公司将寻求员工自愿退休。

关键字: 裁员 东芝

昨天海能达发布公告,称针对产品禁售等判令提起的上诉结果已出:法院决定暂停执行一审法院对公司颁布的产品禁售令及罚款等,公司将与全球合作伙伴紧密合作,即刻恢复正常的商业活动并启动相关产品的销售。

关键字: 禁售令 海能达

业内消息,华为Pura 70第一批现货已到总代,部分经销商也已完成打款,等待华为打响开售“发令枪”。

关键字: 华为Pura 70 华为

业内消息,近日京东集团创始人、董事会主席刘强东以“采销东哥”AI 数字人开启直播首秀,同时亮相京东家电家居、京东超市采销直播间,不到1小时直播间观看量超2000万,并创造京东超市采销直播间开播以来观看人数的最高峰。

关键字: 京东 AI 数字人 刘强东 直播

业内消息,近日苹果CEO蒂姆·库克访问印尼首都雅加达,在与印尼总统佐科·维多多会晤后表示,苹果将考虑在印尼生产的可能性。

关键字: 苹果 库克 印尼

业内消息,微软公司宣布将向阿联酋顶级人工智能公司G42投资15亿美元,以支持这家总部位于阿布扎比的公司缩减在中国业务的承诺。此前该公司表示将减少在中国的业务,并承诺投资于主要的西方市场。

关键字: 微软 G42

业内消息,昨天美国芯片设计公司 AMD 推出了锐龙PRO 8040/8000系列AI处理器芯片,为支持人工智能的PC提供动力,试图在与英伟达和英特尔等竞争对手的AI PC 竞争中获得领先地位。

关键字: AMD 锐龙 AI处理器 芯片

业内消息,近日润晶科技宣布与住友化学株式会社就全资收购该集团旗下的住化电子材料科技 (合肥) 有限公司、住化电子材料科技 (重庆) 有限公司两家公司一事达成一致,并且双方已经完成股权转让合同的签署。在满足股权转让合同上的...

关键字: 润晶科技 收购 住友化学

近日消息,《巴伦周刊》作家Tae Kim在社交媒体平台表示, 一名中层英伟达员工凭借“员工股票购买计划(ESPP)”积累了6200万美元(当前约合人民币4.5亿)的财富。乐见在AI的热潮之下,英伟达股价持续大涨不仅造就了...

关键字: 英伟达

最新消息,全国企业破产重整案件信息网显示:北京市第一中级人民法院裁定受理西安九步坊企业管理合伙企业(有限合伙)对华夏芯(北京)通用处理器技术有限公司申请破产清算一案。众所周知,近几年国内的半导体飞速发展,在制裁和竞争的残...

关键字: 国产芯片 异构处理器 自主知识产权 华夏芯 倒闭 破产
关闭