柔性数组在实际项目中的应用?

举报
嵌入式大杂烩 发表于 2022/08/30 00:52:07 2022/08/30
【摘要】 大家好,我是杂烩君。 柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组: 本篇文章我们就来一起学习柔性数组。 什么是柔性数组? C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。 柔性数组的特点: 结构体中...

大家好,我是杂烩君。

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

0dd4e0fa71646d91f72392ab47ad8340.png

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

什么是柔性数组?

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

柔性数组的特点:

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

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

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

例子:

// 微信公众号:嵌入式大杂烩
#include <stdio.h>   
#include <string.h>
#include <stdlib.h>

typedef struct _data
{
    int len; 
    char val[];
}data_t; 

int main(int arc, char *argv[])
{
    data_t test_data1 = {0}; 
    printf("sizeof(data_t) = %ld\n", sizeof(data_t));

    char *src_data = "hello flexible arr";

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

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

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

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

    return 0;
}

编译、运行:

67f40e262fcae8f3edf98f3ef4234d8e.png

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

柔性数组与指针的区别?

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

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

typedef struct _protocol_format
{
    uint16_t head;    
    uint8_t id;
    uint8_t type;
    uint8_t length;
    uint8_t value[];
}protocol_format_t;
  • value字段以指针的方式定义:

typedef struct _protocol_format
{
    uint16_t head;    
    uint8_t id;
    uint8_t type;
    uint8_t length;
    uint8_t *value;
}protocol_format_t;

(1)结构体占用空间

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

柔性数组方式:

b969d74b8737452bce777247b6077c77.png

指针方式:

876b667ebab3fe1f10e88c11612b50d6.png

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

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

柔性数组方式:

ed797871d176555cca8e92551be9d48e.png

指针方式:

e254c4c76fdbfe383b0fbc429846c0bd.png

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

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

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

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

注意

由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。

猜你喜欢:

分享一种灵活性很高的协议格式(附代码例子)

嵌入式大杂烩周记 | 第 15 期

访问非法内存为什么不会出错?

嵌入式大杂烩周记 | 第 14 期

分享几个实用的代码片段(第二弹)

分享一种你可能不知道的bug定位方法

分享一种修改配置文件的方法

《嵌入式大杂烩周记第 13 期:lz4》

《嵌入式并行多线程处理器,了解一下!》

《分享一种修改配置文件的方法》

《分享几个实用的代码片段(附代码例子)》

《废旧板子再利用:搭建无线调试环境!》

《嵌入式段错误的3种调试方法汇总!》

《简说TCP通信非阻塞接收(附代码例子)》

《TCP通信常用接口的使用封装》

《写国际化的嵌入式代码,时间问题如何处理?》

《Linux命令行万能解压命令》

《嵌入式软件中,总线错误的坑?替大家先踩一步》

《分享嵌入式软件调试方法及几个有用的工具!》

《分享两点提高编程能力的建议!》

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总

文章来源: blog.csdn.net,作者:嵌入式大杂烩,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zhengnianli/article/details/126564728

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。