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

    文章

    480

    浏览量

    70581
  • 编译器
    +关注

    关注

    1

    文章

    1636

    浏览量

    49172
  • C99
    C99
    +关注

    关注

    0

    文章

    4

    浏览量

    6173

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    柔性电子威廉希尔官方网站 和智能面膜 #柔性电子 #印刷电子 #绿展科技

    柔性电子
    绿展科技
    发布于 :2024年11月28日 20:16:50

    数组名之间可以直接赋值吗

    数组之间的赋值能不能直接使用等于号?比如这样的代码。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的头像 发表于 11-26 11:23 170次阅读

    指针数组和二维数组有没有区别

    。 首先是指针数组 s1。 s1 本身是个一维数组数组三个元素,每个元素都是个指针。如果是 64 位系统,三个指针就占了 24 个字节。 使用 sizeof 计算 s1 的大小,结
    的头像 发表于 11-24 11:12 188次阅读

    C语言数组应用计算机导论A第6讲:数组

    C语言数组应用计算机导论A第6讲:数组
    发表于 11-20 15:33 0次下载

    labview字符串数组转化为数值数组

    在LabVIEW中,将字符串数组转换为数值数组是一项常见的任务,尤其是在处理数据采集、信号处理或用户输入时。 1. 理解LabVIEW的数据类型 在开始之前,了解LabVIEW中的数据类型是非
    的头像 发表于 09-04 17:47 2516次阅读

    嵌入式中零长度数组基本操作方法

    C语言零长度数组,听起来可能有点奇怪,因为它没有分配内存空间,无法存储数据。但实际上,零长度数组在Linux内核中随处可见。 零长度数组的定义 首先,我们要明白什么是零长度数组。简单来
    的头像 发表于 05-11 08:49 991次阅读
    嵌入式中零长度<b class='flag-5'>数组</b>基本操作方法

    深入探索KUKA KRL中的数组应用

    如果 CHAR 类型数组的所有数组元素都拥有相同的字符串,则不必单独初始化每个数组元素。忽略右侧的数组下标。(对于一维数组下标,不写下标。)
    的头像 发表于 04-18 10:37 1273次阅读
    深入探索KUKA KRL中的<b class='flag-5'>数组</b>应用

    鸿蒙TypeScript入门学习第11天【Array(数组)】

    数组对象是使用单独的变量名来存储一系列的值。 数组非常常用。
    的头像 发表于 04-09 14:38 1194次阅读
    鸿蒙TypeScript入门学习第11天【Array(<b class='flag-5'>数组</b>)】

    柔性电流探头的优缺点哪些?

    柔性电流探头是一种先进的电气检测威廉希尔官方网站 ,它具有独特的优点和一些局限性。在本文中,我们将深入探讨柔性电流探头的优缺点,为您揭开这一新兴威廉希尔官方网站 的神秘面纱。 一、柔性电流探头的
    的头像 发表于 03-01 11:24 657次阅读
    <b class='flag-5'>柔性</b>电流探头的优缺点<b class='flag-5'>有</b>哪些?

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面存在一些显著的差异。本文将详细探讨这些差异以及它们的优缺点。 1.
    的头像 发表于 02-21 11:30 1061次阅读

    数组和链表区别

    数组和链表的区别,这个问题,不仅面试中经常遇到,考研的同学也得掌握才行。
    的头像 发表于 02-19 15:33 528次阅读
    <b class='flag-5'>数组</b>和链表<b class='flag-5'>有</b><b class='flag-5'>何</b>区别

    PHP中数组的使用方法!

    PHP中数组的使用方法! PHP是一种广泛使用的网络编程语言,它的数组功能非常强大且灵活。数组是一种数据结构,它允许我们在单个变量中存储多个值。 在本篇文章中,我将详细解释PHP数组
    的头像 发表于 01-12 15:11 566次阅读