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

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

3天内不再提示

什么是柔性数组?柔性数组有何优点

工程师邓生 来源:嵌入式大杂烩 作者:ZhengNL 2022-09-14 10:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

867e70b0-3371-11ed-ba43-dac502259ad0.png

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

什么是柔性数组?

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

柔性数组的特点:

结构体中柔性数组成员前面必须至少有一个其他成员。

sizeof返回的这种结构大小不包括柔性数组的内存。

包含柔性数组成员的结构用malloc()函数进行内存的动态分配。

例子:

//微信公众号:嵌入式大杂烩
#include
#include
#include

typedefstruct_data
{
intlen;
charval[];
}data_t;

intmain(intarc,char*argv[])
{
data_ttest_data1={0};
printf("sizeof(data_t)=%ld
",sizeof(data_t));

char*src_data="helloflexiblearr";

//为结构体及其柔性数组成员申请一块连续的空间
intlen=strlen(src_data)+1;
data_t*p_test_data2=(data_t*)malloc(sizeof(data_t)+sizeof(char)*len);
if(NULL==p_test_data2)
{
printf("mallocp_test_data2error
");
returnEXIT_FAILURE;
}

//填充结构体
p_test_data2->len=len;
strncpy(p_test_data2->val,src_data,p_test_data2->len);

printf("p_test_data2->val=%s
",p_test_data2->val);

//释放内存
free(p_test_data2);
p_test_data2=NULL;

return0;
}

编译、运行:

8695daca-3371-11ed-ba43-dac502259ad0.png

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

柔性数组与指针的区别?

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

value字段以柔性数组的方式定义:

typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_tvalue[];
}protocol_format_t;

value字段以指针的方式定义:

typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_t*value;
}protocol_format_t;

(1)结构体占用空间

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

柔性数组方式:

86a5feb4-3371-11ed-ba43-dac502259ad0.png

指针方式:

86b977be-3371-11ed-ba43-dac502259ad0.png

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

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

柔性数组方式:

86ccd46c-3371-11ed-ba43-dac502259ad0.png

指针方式:

86e4f7f4-3371-11ed-ba43-dac502259ad0.png

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

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

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




审核编辑:刘清

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

    关注

    1

    文章

    484

    浏览量

    71676
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51082
  • C99
    C99
    +关注

    关注

    0

    文章

    4

    浏览量

    6473

原文标题:柔性数组在实际项目中的应用?

文章出处:【微信号:wenzi嵌入式软件,微信公众号:wenzi嵌入式软件】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    柔性天线技术原理及核心特性

    柔性天线的定义与工作原理 柔性天线是一种基于柔性基材(如聚酰亚胺、PET或透明导电膜)的无线通信天线,其核心功能是通过无线电波实现信号的接收和传输。其工作原理与传统天线类似,但在结构设计上更加轻便
    发表于 12-05 09:10

    求助!IMU选刚性还是柔性?复杂场景快愁哭了

    #IMU选型 #工程监测 做老旧隧道监测的来求助!之前用刚性IMU,隧道里震动就容易飘数据,换了两台都没解决,老板快把我骂哭了? 听朋友说全柔性IMU靠谱,说能像创可贴一样贴在隧道壁上,抗震动抗
    发表于 11-25 17:02

    数组的初体验

    袋中的物品是按一定顺序放置的。 1.我们来看一下如何声明一个数组: 数据类型 数组名称[长度]; 数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的
    发表于 11-25 08:06

    二维数组介绍

    大家不要认为二维数组在内存中就是按行、列这样二维存储的,实际上,不管二维、三维数组… 都是编译器的语法糖。 存储上和一维数组没有本质区别,举个例子: int array[3][3
    发表于 11-25 07:42

    Molex推出蜂窝柔性天线的特性与优势-赫联电子

      Molex蜂窝柔性天线支持不断发展的LTE和4G蜂窝技术。该器件采用平衡的传输设计,可通过消除额外的电路、频率调谐和电子元件集成,最大限度地减少地面-平面效应、降低成本并减少所需的工程资源。该
    发表于 10-14 09:37

    JMC1200T柔性和可扭转波导JUPITER

    JMC1200T柔性和可扭转波导JUPITERJMC1200T是由JUPITER生产的柔性和可扭转波导,主要用于高频率(微波)数据传输的波导组件,兼具柔性和可扭转性能,适用于各种复杂应用环境和动态
    发表于 07-10 09:38

    3D打印柔性材料哪些?全面解析主流柔性耗材类型

    3D打印柔性材料主要包括TPU(高弹性、耐磨)、TPE(超柔软、高伸长率)和柔性PLA(易打印、适合新手)三大类,硬度范围覆盖60A-95A,可满足工业、医疗、消费电子等领域需求。
    的头像 发表于 04-21 11:14 1902次阅读
    3D打印<b class='flag-5'>柔性</b>材料<b class='flag-5'>有</b>哪些?全面解析主流<b class='flag-5'>柔性</b>耗材类型

    stm32 DMA串口接收到数组数组元素顺序错乱怎么解决?

    数据。理论上讲上位机发送数据的数量和顺序都是固定的——比如AABA,可是现在有干扰——一次上位机多发送了一个数据——变成了CAABA,根据DMA循环原理,存到数组里的数据就变成了AAAB——并且还是根据
    发表于 03-12 08:02

    FPC柔性电子标签介绍和应用

    什么是FPC标签?FPC标签,即柔性电子标签,基于柔性印刷电路板(FlexiblePrintedCircuit,FPC)技术制作而成。与传统刚性标签不同,FPC标签具有超薄、弯曲性强等优点,非常适合
    的头像 发表于 03-03 14:40 1234次阅读
    FPC<b class='flag-5'>柔性</b>电子标签介绍和应用

    柔性网线和非柔性网线区别有哪些

    ,外部覆盖一层柔软的PVC材料或其他柔软的保护层。 非柔性网线(常规网线): 定义:非柔性网线是传统的网络连接线,通常不具备柔性网线的灵活性和弯曲性能。 结构:可能包括双绞线(如超五类、六类双绞线)、同轴电缆等,外部
    的头像 发表于 01-09 10:10 1592次阅读

    Molex 蜂窝柔性天线的特性和优点-赫联电子

      Molex蜂窝柔性天线支持不断发展的LTE和4G蜂窝技术。该器件采用平衡的传输设计,可通过消除额外的电路、频率调谐和电子元件集成,最大限度地减少地面-平面效应、降低成本并减少所需的工程资源。该
    发表于 12-30 11:19

    应用于柔性电子电路的导电材料介绍

    随着物联网与可穿戴技术的发展,柔性电子器件已成为未来电子器件发展的主流趋势。其中,以柔性聚合物为衬底,以金属薄膜、石墨烯、导电墨水等导电材料为导体的柔性电路是柔性电子器件发展的关键组成
    的头像 发表于 12-25 10:45 3016次阅读

    数组的下标为什么可以是负数

    最近有同学发来这样一段代码,并提出一个问题,数组的下标为什么可以是负数?     #include int main(){ const char *s = "helloworld"; const
    的头像 发表于 12-20 11:18 858次阅读

    柔性光伏系统拉力监测装置:柔性光伏系统新标配

    当前,新能源技术正以前所未有的速度推动着全球能源结构的转型。其中,柔性光伏作为光伏领域的一股新兴力量,逐步改变着我们对光伏技术的传统认知。那么,柔性光伏究竟为何物?它又是如何克服现有挑战,实现技术
    的头像 发表于 12-10 17:39 985次阅读