资讯专栏INFORMATION COLUMN

你的c语言老师介绍过柔性数组吗?没有的话不妨进来看看吧~~

Rindia / 1610人阅读

摘要:柔性数组笔记自取柔性数组笔记欢迎喜欢学习的朋友互关一起努力博主目前在学习语言转码道路艰险,需要你们的支持文章目录柔性数组什么是柔性数组柔性数组成员的创建柔性数组成员特点两种方式创建柔性数组成员什么是柔性数组中,结构

柔性数组

??笔记自取~ :柔性数组笔记??

❤️欢迎喜欢学习C/C++的朋友互关一起努力!!
博主目前在学习C语言!!转码道路艰险,需要你们的支持!❤️



1. 什么是柔性数组

✨C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员

柔性数组成员前必须至少有一个成员


2. 柔性数组成员的创建

直接用一段代码感受吧?

struct stu{    int a;    int b[];//柔性数组成员};struct stu{    int a;    int b[0];//柔性数组成员    //这里b[0]并不是指数组元素为0,而是数组元素不确定}

所以柔性数组又称0长度数组
以上两种写法都可以,需要根据编译器支持的类型去判断


3. 柔性数组成员特点

??柔性数组成员应该注意以下特点:

  • sizeof(结构体),计算结构体大小不包括柔性数组成员的大小
  • 柔性数组成员用malloc或者calloc函数进行合理的内存的动态分配
  • 分配的内存应该大于结构体的大小

4. 两种方式创建柔性数组成员

我们给柔性数组成员分配一下动态内存空间看看

首先数数组外形的

?优点:方便释放,mallco次数少,不容易出现内存泄漏

struct stu{    int a;    int b[];//柔性数组成员};int main(){    struct stu* st = (struct stu*)malloc(sizeof(struct stu)                                          + 4 * sizeof(int));    //这样就完成了柔性数组内容的分配    //现在的int b[]相当于 int b[4]        if(st == NULL)    {        return -1;    }    else    {        st->a = 0;        int i = 0;        for(i = 0; i < 4; i++)        {            st->b[i] = i;                    }    }        //空间不够大,继续申请开辟空间    struct stu* s = (struct stu*)realloc(st, sizeof(struct stu)                                          + 8 * sizeof(int));     free(st);    st = NULL;        if(s == NULL)    {        return -1;    }    else    {        int i = 0;        for(i = 0; i < 8; i++)//b[]相当于一个b[8]        {            s->b[i] = i;                    }    }    printf("%d", s->b[7]);//打印出来是7        free(s);    s = NULL;//结束释放内存        return 0; }

??看看指针类型的柔性数组成员是如何开辟的

  • 疑问:最后一个元素不是数组吗?为什么是指针?

  • 看下面代码的注释,你就知道了

??优点:访问速度快

??缺点:melloc过度,会导致内存碎片过多,降低空间利用率

struct stu{    int a;    int* b;//柔性数组成员,指向一个整型的地址,目前还不能算数组};int main(){    struct stu* st = (struct stu*)malloc(sizeof(struct stu));    //先给a分配好地址    if (st == NULL)    {        return -1;    }    else//赋值    {        st->b = (int*)malloc(4 * sizeof(struct stu));        //现在给b分配4个整型大小的空间        //b是空间起始位置地址,b可以看作一个数组的起始地址了,就可以当作是数组名        if (st->b == NULL)        {            return -1;        }        else         {            st->a = 0;            int i = 0;            for (i = 0; i < 4; i++)            {                st->b[i] = i;            }        }            }    printf("%d/n", st->b[3]);//打印3    //空间不够大,继续申请开辟空间    int* s = (int*)realloc(st->b, 8 * sizeof(int));    //空间扩大    if (s == NULL)    {        return -1;    }    else    {        st->b = s;//这样b又是空间起始地址,可以当作数组进行赋值        int i = 0;        for (i = 0; i < 8; i++)        {            st->b[i] = i;        }    }    printf("%d/n", st->b[7]);//打印7    //空间释放    //先释放整个结构体mallco的空间    free(st);    st = NULL;    free(s);    s = NULL;    return 0;}

❗️❗️❗️中间过程额外要注意判断动态内存分配所返回的指针是否为空指针❗️❗️❗️


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121854.html

相关文章

  • 广州三本找Java实习经历

    摘要:广州三本大三在读,在广州找实习。这篇文章其实主要是记录一下自己的面试经历,希望大家看完之后能有所了解进入中小公司究竟需要什么水平。时间复杂度尽量低一些使用快排的,将给出的随机数做基准值返回的坐标就是了。 前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应...

    enali 评论0 收藏0
  • 前端架构师亲述:前端工程师成长之路的 N 问 及 回答

    摘要:问题回答者黄轶,目前就职于公司担任前端架构师,曾就职于滴滴和百度,毕业于北京科技大学。最后附上链接问题我目前是一名后端工程师,工作快五年了。 showImg(https://segmentfault.com/img/bVbuaiP?w=1240&h=620); 问题回答者:黄轶,目前就职于 Zoom 公司担任前端架构师,曾就职于滴滴和百度,毕业于北京科技大学。 1. 前端开发 问题 大...

    crossoverJie 评论0 收藏0
  • SegmentFault 社区访谈 | 边城:Coding Twenty Years, Learni

    摘要:边城这个名字,清蒸的理解是,和编程谐音,但似乎又不仅仅是这层含义,不知和边城浪子这词有没有关系呢边城大大来简单的说说名字的由来呗这个名字还真跟边城浪子有关。我认为阮老师的教程属于后者。 showImg(https://segmentfault.com/img/bVSv3I?w=900&h=385); 转眼社区访谈进行了 4 期,第一期的公子,第二期的有明,第三期的依云酱,第四期的 mc...

    instein 评论0 收藏0
  • 吧,这就是现代化 PHP 该有的样子

    摘要:这大概是我没有及早使用,或多数开发者流连现状造成的。它就是,一个的框架。行为驱动开发是来自测试驱动开发的开发过程。简单的说,它就是经常可能一天几次将小块代码整合进基础代码当中的行为。 showImg(https://segmentfault.com/img/remote/1460000013769815); 这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。 文章...

    Tangpj 评论0 收藏0
  • 初学者福音!可能是最适合你的Java学习路线和方法推荐。

    摘要:学习完多线程之后可以通过下面这些问题检测自己是否掌握,下面这些问题的答案以及常见多线程知识点的总结在这里。可选数据结构与算法如果你想进入大厂的话,我推荐你在学习完基础或者多线程之后,就开始每天抽出一点时间来学习算法和数据结构。 我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 35k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://...

    yanest 评论0 收藏0

发表评论

0条评论

Rindia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<