打印
[ARM入门]

什么是柔性数组?

[复制链接]
1106|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呐咯密密|  楼主 | 2023-5-29 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

使用特权

评论回复

相关帖子

沙发
yangjiaxu| | 2023-5-31 08:54 | 只看该作者
搞得有点深奥啊,还不知道啥是柔性数组呢,一般这种柔性数组都在哪里应用啊?

使用特权

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

本版积分规则

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

481

主题

3796

帖子

47

粉丝