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

    浏览量

    71998
  • 编译器
    +关注

    关注

    1

    文章

    1673

    浏览量

    52042
  • C99
    C99
    +关注

    关注

    0

    文章

    4

    浏览量

    6521

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    技术资讯 I 柔性电路设计

    本文要点聚酰胺和聚酯薄膜是制作柔性电路板的常用基材。柔性电路板可弯曲、卷绕、折叠、扭转等。柔性电路以柔性互连结构取代导线和电缆,能够节省空间、缩小尺寸、减轻重量已修改。当印刷电路板应用
    的头像 发表于 04-01 16:33 166次阅读
    技术资讯 I <b class='flag-5'>柔性</b>电路设计

    揭秘:中山这家高新企业如何用“柔性电池”改变未来生活

    为“高新技术企业”、2024年获评“科技型中小企业”的新锐力量,力钜新能源正试图打破人们对锂电池“硬邦邦、方方正正”的刻板印象。他们手中的王牌,是一项可能重塑未来穿戴设备、智能家居的关键技术——柔性锂电池。打破
    发表于 03-28 15:07

    柔性屏幕出绿线用激光机修复

    一、引言 柔性屏幕凭借可弯曲、轻薄便携的特性,已广泛应用于折叠手机、柔性穿戴设备等终端产品。绿线故障是柔性屏幕的高发缺陷,表现为屏幕出现固定或闪烁的绿色线条,严重破坏视觉体验,甚至可能随弯折次数增加
    的头像 发表于 03-23 11:07 329次阅读
    <b class='flag-5'>柔性</b>屏幕出绿线用激光机修复

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结
    的头像 发表于 01-25 09:33 5723次阅读
    RT-Thread Vector软件包:嵌入式开发的动态<b class='flag-5'>数组</b>容器 | 技术集结

    从FFC到背光驱动:Parlex柔性互连解析

    在消费电子、工业控制和显示系统中,柔性扁平线(FFC/FPC)早已成为高密度、轻薄化设计的重要组成部分。Parlex USA LLC 作为柔性互连领域的专业厂商,其柔性扁平线技术被广泛应用于显示模组、背光驱动、电源与信号混合传输
    的头像 发表于 01-24 15:22 1865次阅读

    keil中c语言的动态分配内存

    的: 那么问题来了,既然不用柔性数组成员也可以达到同样的效果,那么柔性数组成员的意义何在? 仔细分析我们就能发现,使用柔性
    发表于 01-21 06:04

    客户案例分享 | 柔性屏广告机背后功臣,防水高速不松脱就看这款连接器

    柔性屏广告机上的USB连接器作用?01本地播放传输入口对于部署在户外无网络场景或者担心网络病毒入侵无公网接入的柔性屏,USB接口连接器是广告内容接入更适宜的方
    的头像 发表于 01-06 18:46 397次阅读
    客户案例分享 | <b class='flag-5'>柔性</b>屏广告机背后功臣,防水高速不松脱就看这款连接器

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

    柔性天线的定义与工作原理 柔性天线是一种基于柔性基材(如聚酰亚胺、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

    柔性屏弯折试验机:守护柔性显示时代的 “耐用密码”

    弯折试验机的存在意味着更可靠的使用体验;对于产业来说,它则是推动柔性显示技术迭代的隐形基石。在这场屏幕形态的变革中,每一台不停运转的弯折试验机,都在为柔性屏的 “耐用性” 写下最严谨的注脚。
    的头像 发表于 08-06 14:02 1096次阅读
    <b class='flag-5'>柔性</b>屏弯折试验机:守护<b class='flag-5'>柔性</b>显示时代的 “耐用密码”

    TE锁定型柔性印刷电连接器优势?-赫联电子

      TE Connectivity(TE)推出的新型0.5mm锁定式柔性印刷电路(FPC)连接器可提供牢固的固定,以防止在恶劣环境中使用时意外脱开。   这些FPC连接器的型号为2041215-1
    发表于 07-21 12:53

    JMC1200T柔性和可扭转波导JUPITER

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