[ARM入门] 什么是柔性数组?

[复制链接]
 楼主| 呐咯密密 发表于 2023-5-29 13:50 | 显示全部楼层 |阅读模式

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. }
    编译、运行:

yangjiaxu 发表于 2023-5-31 08:54 | 显示全部楼层
搞得有点深奥啊,还不知道啥是柔性数组呢,一般这种柔性数组都在哪里应用啊?

评论

可以比较方便的为结构体指针动态分配内存。其实结构体中的柔性数组也可以使用指针代替,只是指针也是变量会占用一个指针的内存空间,柔性数组如果不分配内存的话是不会占用内存的。与指针相比我认为最方便的好处是,结构体中的柔性数组可以跟随结构体成员一起分配和释放内存,如果用指针替代柔性数组,还需要为结构体中的指针成员单独分配和释放内存  发表于 2023-6-1 15:16
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

567

主题

4081

帖子

56

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