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

    文章

    473

    浏览量

    70364
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627
  • C99
    C99
    +关注

    关注

    0

    文章

    4

    浏览量

    6051

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    PHP中数组的使用方法!

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

    数组和指针不相同吗?数组和指针有哪些区别

    数组就是指针,指针就是数组,这样的言论在评论区看到不下于10次。
    的头像 发表于 12-13 16:34 359次阅读
    <b class='flag-5'>数组</b>和指针不相同吗?<b class='flag-5'>数组</b>和指针有哪些区别

    数组与指针不能混用的情况

    数组与指针不能混用的情况  数组与指针是 C/C++ 中非常常见的特性和概念。然而,在某些情况下,数组与指针是不能混用的。这种情况通常涉及到数组的内存分配和
    的头像 发表于 12-07 13:46 317次阅读

    C语言中数组的用法

    C语言的数组是一种数据结构,它可以存储多个相同类型的数据,例如整数,字符,浮点数等。数组的每个元素都有一个索引,用来表示它在数组中的位置。数组的索引从0开始,也就是说,
    的头像 发表于 11-24 17:48 853次阅读
    C语言中<b class='flag-5'>数组</b>的用法

    c语言中数组怎么定义

    C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中,定义数组的语法如下
    的头像 发表于 11-24 10:11 1118次阅读

    C语言如何创建数组

    C语言是一种非常强大和灵活的编程语言,它提供了若干数据类型来存储和操作数据。其中之一就是数组,它可以用来存储一系列具有相同数据类型的元素。本文将详细介绍如何在C语言中创建数组,并探讨数组的一些常见
    的头像 发表于 11-24 10:08 847次阅读

    将一维数组转为二维python

    将一维数组转为二维数组是一个常见的问题,特别是在处理数据时。一维数组是由一个连续的数据块组成,而二维数组则是由多个一维数组组成的
    的头像 发表于 11-23 14:54 2265次阅读

    什么是数组数组有什么用?数组的使用方法

    数组(Array)是有序的元素序列。
    的头像 发表于 11-08 14:58 708次阅读
    什么是<b class='flag-5'>数组</b>?<b class='flag-5'>数组</b>有什么用?<b class='flag-5'>数组</b>的使用方法

    Shell脚本程序开发-数组(四)

    数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
    的头像 发表于 10-22 17:50 293次阅读
    Shell脚本程序开发-<b class='flag-5'>数组</b>(四)

    数组的定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。
    的头像 发表于 10-09 09:39 1350次阅读

    零长数组如何使用定长包定义数据缓冲区

    长度可以为0 ,这是GNU对C语言的扩展。 先对零长数组做个介绍: 零长数组 :也叫 柔性数组(变长数组) : 用途 : 长度为0的
    的头像 发表于 09-27 14:58 457次阅读

    C++数组名和数组拷贝详解

    C++数组间赋值不能直接通过数组名称 randy = sesame进行,因为数组名并不是指针,大部分情况下,编译器会隐式转换为指向数组首元素的指针常量。
    发表于 08-21 15:09 300次阅读
    C++<b class='flag-5'>数组</b>名和<b class='flag-5'>数组</b>拷贝详解

    C语言中指针数组数组指针的区别

    指针和数组之间存在着紧密的关系。在本文中,我们将探讨指针和数组的关系、指针算术和数组遍历、多维数组与指针以及指针数组
    发表于 08-17 15:29 280次阅读

    C 语言数组的基本结构

    数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考。目前有以下18道题目。 数组求和 求数组的最大值和最小值 求
    的头像 发表于 06-22 10:56 387次阅读