0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言柔性数组详解

玩转单片机 来源:玩转单片机 2023-03-06 09:06 次阅读

下班写文章难免会有些出错,也感谢那些在后台留言指出错误的读者;表驱那篇推文存在数组越界问题,可以通过预先开辟一个大数组的方式解决,但这样解决方式会存在资源浪费问题,如果想不浪费资源来解决数组溢出的问题,那就来看看柔性数组怎么样!

|简单介绍

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

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

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

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

#include
 
typedef struct 
{
    int length;
intarr[];
}data_t;
 
int main()
{
    data_t data1;
    printf("sizeof:%d
",sizeof(data1));
    return 0; 
}

注意:在DEV CPP中,屏蔽了第五行并不会报错!

| 简单使用

#include
#include


typedef struct 
{
    int length;
    int arr[];
}data_t;
 
int main()
{
    //为结构体及其柔性数组成员申请一块连续的空间
    data_t *p=(data_t*)malloc(sizeof(data_t)+10*sizeof(int));
    if(NULL==p)
    {
        printf("malloc error
");
        return 0;
    }
    p->length=10;
    for(int i=0;ilength;i++)
    {
        p->arr[i]=i;//赋值
        printf("%d ",p->arr[i]);
    }
    printf("
");
    //重新调整所申请的空间,将柔性数组调整为40
    p=(data_t*)realloc(p,sizeof(int)+40);
    if(NULL==p)
    {
        printf("malloc error
");
        return 0;
    }
    p->length=40;
    for(int i=0;ilength;i++)
    {
        p->arr[i]=i;//赋值
        printf("%d ",p->arr[i]);
    }
    printf("
");
    //释放内存
    free(p);
    p=NULL;
    return 0; 
}

| 优势总结

柔性数组的特点在于只需要用一次malloc创建就可以,而且和结构体是在同一块连续的空间,对比在结构体中放指针成员而言,可以减少内存碎片化,因为malloc申请的内存位置是任意的;柔性数组申请的内存更加集中,有利于查找使用;柔性数组只用开辟一次,有利于提高访问速度;用malloc函数进行动态内存申请时,柔性数组的大小应该大于结构体的大小以便于柔性数组适应预期大小。 --END--

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72777
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128817
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750

原文标题:C语言|柔性数组

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言数组详解

    介绍C语言数组的知识点。
    的头像 发表于 05-19 10:15 5999次阅读

    C语言中的数组详解

    数组:只能存放一种数据类型,比如int类型的数组、float类型的数组,里面存放的数据称为“元素”。
    发表于 09-09 10:54 1360次阅读

    入门——C语言:二维数组#C语言

    C语言数组
    jf_49750429
    发布于 :2022年11月16日 15:31:03

    C语言内存管理详解

    C语言内存管理详解,很不错的一份资料.
    发表于 08-06 23:14

    C语言数组格式介绍

    C语言数组的格式
    发表于 12-17 07:40

    C语言数组类型有哪些?

    C语言数组类型有哪些?
    发表于 10-15 09:06

    c语言二维数组定义及其规则详解

    一维数组只有一个下标,,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维
    发表于 11-16 08:49 2.2w次阅读
    c<b class='flag-5'>语言</b>二维<b class='flag-5'>数组</b>定义及其规则<b class='flag-5'>详解</b>

    c语言之字符数组详解

    ("%c ",a[i][j]);}printf("\n");}} 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。当把一个字符串存入数组时,也把结束符‘\0’存入数组
    发表于 11-16 10:22 1953次阅读

    C语言数组详解

    上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。以下是上面所讨论的
    的头像 发表于 09-25 15:43 1.5w次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>数组</b><b class='flag-5'>详解</b>

    C语言总结_数组知识

    当前文章复盘C语言数组数组定义规则、数组空间类型、数组下标使用、数组存放的数据类型、
    的头像 发表于 08-14 09:38 1079次阅读

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?
    的头像 发表于 08-31 13:21 1681次阅读

    柔性数组与指针的区别

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

    什么是柔性数组柔性数组有何优点

    C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组
    的头像 发表于 09-14 10:34 1037次阅读

    C语言如何创建数组

    C语言是一种非常强大和灵活的编程语言,它提供了若干数据类型来存储和操作数据。其中之一就是数组,它可以用来存储一系列具有相同数据类型的元素。本文将详细介绍如何在C语言中创建
    的头像 发表于 11-24 10:08 846次阅读

    c语言数组怎么定义

    C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中,定义
    的头像 发表于 11-24 10:11 1111次阅读