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

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

3天内不再提示

柔性数组与指针的区别

我快闭嘴 来源:嵌入式大杂烩 作者:ZhengNL 2022-09-02 15:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

02ba2d8e-29e2-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;
}

编译、运行:

02d5157c-29e2-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)结构体占用空间

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

柔性数组方式:

02f9d02e-29e2-11ed-ba43-dac502259ad0.png

指针方式:

0315dae4-29e2-11ed-ba43-dac502259ad0.png

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

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

柔性数组方式:

033113f4-29e2-11ed-ba43-dac502259ad0.png

指针方式:

035cc562-29e2-11ed-ba43-dac502259ad0.png

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

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

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

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

审核编辑:汤梓红


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

    关注

    5186

    文章

    20142

    浏览量

    328643
  • 指针
    +关注

    关注

    1

    文章

    484

    浏览量

    71669
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27110
  • C99
    C99
    +关注

    关注

    0

    文章

    4

    浏览量

    6471

原文标题:如何在嵌入式项目中使用柔性数组?

文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言数组指针区别

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言数组指针区别,希望能对你有所帮助。
    发表于 07-11 12:40 677次阅读
    C语言<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的<b class='flag-5'>区别</b>

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

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

    指针数组数组指针区别

    int (*p)[4];// 定义一个数组指针,指向含4个元素的一维数组数组元素是int类型。int *p[4];// 定义一个指针
    发表于 07-15 21:41

    指针数组数组指针及其函数指针有何区别

    进程的五种状态模型分别是哪些呢?指针数组数组指针及其函数指针有何区别呢?
    发表于 12-24 07:28

    指针数组数组指针有什么区别和联系呢

    什么是指针数组数组指针指针数组数组
    发表于 12-24 06:55

    指针数组都是C语言的精髓所在 两者有何联系区别

    指针数组都是C语言的精髓所在,对于很多C程序员来说,如果你问这样一个问题:数组指针有什么区别?他们的答案很可能是:”
    的头像 发表于 05-27 14:51 4737次阅读
    <b class='flag-5'>指针</b>和<b class='flag-5'>数组</b>都是C语言的精髓所在 两者有何联系<b class='flag-5'>区别</b>

    详谈数组指针区别与联系

    详谈数组指针区别与联系
    的头像 发表于 06-29 15:18 2.3w次阅读
    详谈<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的<b class='flag-5'>区别</b>与联系

    指针数组数组指针区别

    这里我们区分两个重要的概念:指针数组数组指针
    的头像 发表于 06-29 15:30 2.1w次阅读
    <b class='flag-5'>指针</b><b class='flag-5'>数组</b>和<b class='flag-5'>数组</b><b class='flag-5'>指针</b>的<b class='flag-5'>区别</b>

    理解函数指针、函数指针数组、函数指针数组指针

    理解函数指针、函数指针数组、函数指针数组指针
    的头像 发表于 06-29 15:38 1.5w次阅读
    理解函数<b class='flag-5'>指针</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>的<b class='flag-5'>指针</b>

    C语言指针数组区别

    在C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针数组到底有什么区别?
    的头像 发表于 07-18 16:29 2552次阅读

    二维数组数组指针以及指针数组

    二维数组数组指针以及指针数组
    的头像 发表于 08-16 09:02 3505次阅读

    C语言中的char数组和char指针有什么区别

    让我们通过下面的例子,来了解 C语言中字符数组和字符指针之间的区别
    的头像 发表于 01-29 16:35 3502次阅读

    数组指针不能混用的情况

    数组指针不能混用的情况  数组指针是 C/C++ 中非常常见的特性和概念。然而,在某些情况下,数组
    的头像 发表于 12-07 13:46 1184次阅读

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

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

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

    指针数组和二维数组有没有区别?比如这样的两个代码。 int main(){ char *s1[] = { "hello", "world", "total" }; char s2[][
    的头像 发表于 11-24 11:12 781次阅读