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

    文章

    2990

    浏览量

    73837
  • C语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    136005
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62352
  • 数组
    +关注

    关注

    1

    文章

    412

    浏览量

    25889
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10826

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

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

收藏 人收藏

    评论

    相关推荐

    C语言数组详解

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

    C语言教程之查找数组中的最值

    C语言教程之查找数组中的最值,很好的C语言资料,快来学习吧。
    发表于 04-25 15:13 0次下载

    C语言学习数组的笔记

    C语言学习数组的笔记
    发表于 12-17 16:04 0次下载

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

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

    c语言之字符数组详解

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

    C语言数组详解

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

    为什么C语言函数不能返回数组

    C语言函数可以返回指针、结构体,为什么不能返回数组? 下面一步一步来分析: 1 函数不能返回数组C
    的头像 发表于 03-29 11:18 1966次阅读

    C语言指针和数组的区别

    C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针和数组到底有什么区别??
    的头像 发表于 07-18 16:29 1885次阅读

    C语言总结_数组全方位练习

    C语言数组的练习题:涉及到数组插入、数组删除、数组下标数据的左移右移、
    的头像 发表于 08-14 09:34 859次阅读

    C语言总结_数组知识

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

    C语言_数组的查找、替换、排序、拼接

    这篇文章主要是总结C语言的位运算几个实战例子,接着介绍数组的基本定义用法、数组排序、插入、拼接、删除、字符串查找替换等。
    的头像 发表于 08-14 09:48 2515次阅读

    C语言-数组

    C语言数组是一个同类型数据的集合,主要用来存储一堆同类型的数据。
    的头像 发表于 08-14 09:59 1254次阅读

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

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

    C语言如何创建数组

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

    c语言数组怎么定义

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