[ARM入门] 柔性数组在实际项目中的应用?

[复制链接]
 楼主| 呐咯密密 发表于 2022-8-30 14:27 | 显示全部楼层 |阅读模式
什么是柔性数组?

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

柔性数组的特点:

  • 结构体中柔性数组成员前面必须至少有一个其他成员。
  • sizeof返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc()函数进行内存的动态分配。

例子:

  1. #include <stdio.h>   
  2. #include <string.h>
  3. #include <stdlib.h>

  4. typedef struct _data
  5. {
  6.     int len;
  7.     char val[];
  8. }data_t;

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

  13.     char *src_data = "hello flexible arr";

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

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

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

  26.     // 释放内存
  27.     free(p_test_data2);
  28.     p_test_data2 = NULL;

  29.     return 0;
  30. }
复制代码
编译、运行:
下面我们一起通过实例来认识柔性数组的优点。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 呐咯密密 发表于 2022-8-30 14:28 | 显示全部楼层
柔性数组与指针的区别?
上一节的协议格式结构体其实可以又如下两种创建方式:

value字段以柔性数组的方式定义:
  1. typedef struct _protocol_format
  2. {
  3.     uint16_t head;   
  4.     uint8_t id;
  5.     uint8_t type;
  6.     uint8_t length;
  7.     uint8_t value[];
  8. }protocol_format_t;
复制代码

value字段以指针的方式定义:
  1. typedef struct _protocol_format
  2. {
  3.     uint16_t head;   
  4.     uint8_t id;
  5.     uint8_t type;
  6.     uint8_t length;
  7.     uint8_t *value;
  8. }protocol_format_t;
复制代码
 楼主| 呐咯密密 发表于 2022-8-30 14:28 | 显示全部楼层
(1)结构体占用空间
柔性数组的方式结构体占用较指针的方式少。

柔性数组方式:

指针方式:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 呐咯密密 发表于 2022-8-30 14:29 | 显示全部楼层
(2)代码简洁及访问速度方面

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

柔性数组方式:

指针方式:

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4081

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部