加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 什么是柔性数组?
    • 柔性数组与指针的区别?
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

什么是柔性数组?柔性数组与指针的区别?

2022/08/29
2904
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

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

什么是柔性数组?

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) = %ldn", 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 errorn");
        return EXIT_FAILURE;
    }

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

    printf("p_test_data2->val = %sn", p_test_data2->val); 

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

    return 0;
}

编译、运行:

 

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

柔性数组与指针的区别?

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

  • 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)结构体占用空间

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

柔性数组方式:

 

指针方式:

 

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

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

柔性数组方式:

指针方式:

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

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

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
KSZ9031RNXVB-VAO 1 Microchip Technology Inc Ethernet Transceiver

ECAD模型

下载ECAD模型
暂无数据 查看
SN74AVC4T245RSVR 1 Texas Instruments 4-Bit Dual-Supply Bus Transceiver with Configurable Voltage-Level Shifting and 3-State Outputs 16-UQFN -40 to 85

ECAD模型

下载ECAD模型
$1.94 查看
ABMM2-20.000MHZ-E2-T 1 Abracon Corporation CRYSTAL 20.0000MHZ 18PF SMD

ECAD模型

下载ECAD模型
$1.39 查看

相关推荐

电子产业图谱

本公众号专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,公众号内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!