柔性数组知识点

这篇具有很好参考价值的文章主要介绍了柔性数组知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是柔性数组

什么是柔性数组?柔性数组其实也是动态内存管理部分的内容。这节主要来复习柔性数组的知识点。 

当结构体的最后一个成员为数组, 且这个数组的大小未确定时, 我们就称它是柔性数组。

如:

struct stu

{

        char name[20];

        int age;

        char adress[];

}

这里的adress就是一个柔性数组。 (写成char adress[0] 可能报错)

柔性数组的特点 

特点1. 柔性数组成员之前必须有一个其他成员。 

特点2. 进行结构体大小计算时不包含柔性数组成员的大小。如:
 

struct a

{

        int i;

        int a[];

}

 结构体a的大小是4,没有计算a的大小。 

柔性数组的使用

typedef struct a

{

        int i;

        int price[];

}type_a;

int main()

{

        type_a* tmp = (type_a*)malloc(sizeof(type_a) + sizeof(int) * 10); //这里的第一个sizeof是计算                                                                                                                 //的第一个成员i的大小,                                                                                                                     //+后面的计算的是为prince                                                                                                                 //这个柔性数组开辟的空间

        for(int j = 0; j < tmp->i;  j++)

        {

                tmp->price[ j ] = j;        

        }

        free(tmp);

        return 0;

}

柔性数组使用的好处

好处1.

通过上面的使用我们可以发现, 我们使用柔性数组时,是定义一个结构体指针, 然后通过动态内存分配直接申请一块大的内存。 这些内存显然是连续的。 而柔性数组的大小也随着分配确定了下来一起成为一个确定的结构体。 而后续当我们完成使用后, 想要释放空间时, 我们只需要通过那个结构体指针来释放掉这块空间就好。 

但是如果我们不使用柔性数组, 而是把柔性数组改成一个指针呢。我们会怎么做, 为了达成上面的效果, 我们会通过动态内存分配申请一大块内存, 将这块内存给给这个指针。 但是, 这里就有了一个问题,那就是这个指针所指向的内存空间和结构体的内存空间不是连续的(随即开辟, 有可能连续, 但是几率太小)。这样的话, 假如我们通过结构体指针释放结构体内存时, 那个我们为结构体的成员指针开辟的空间就泄露了。 出现问题。 这就是二次分配问题需要注意的地方。 我们要先释放成员指针指向的内存空间。 再释放结构体内存空间。 

用户使用的时候有时候是不知道具体的代码是怎么实现的。 所以柔性数组可以很好的规避二次分配出现的问题。

好处2.使用柔性数组因为空间是连续的, 所以能加快程序运行速度。文章来源地址https://www.toymoban.com/news/detail-836099.html

到了这里,关于柔性数组知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

    ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三章课后习题的过程中,我给大家拓展了一些讲义中没有

    2024年04月22日
    浏览(54)
  • C语言知识点汇总

    C语言知识点保姆级总结,这不得进你的收藏夹吃灰?! 拖了很久的C语言所学知识的简单小结,内容有点多,第一次总结也可能有错误或者不全面,欢迎随时补充说明! ​ 用不同数据类型所定义的变量所占空间大小不一样,定义的变量不是保存于数据类型中,而是因为只有

    2024年01月23日
    浏览(51)
  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(51)
  • Js水几个基础知识点:数组的操作,字符串和数组之间的互转,持续补充,欢迎关注

    一、插入 / 删除元素: 我们就不从创建开始讲了,那个太基础了,js创建数组一般都直接let arr = […,…,…],有部分仁兄喜欢new Array(…, …, …),这样看起来可能高级点,结果是一样的哈。 这里我们直接来讨论插入元素: 1、在末尾插入 / 删除元素(push / pop,操作原数组)

    2024年02月09日
    浏览(59)
  • 计算机语言知识点梳理

    python是一门强类型、动态型、解释型语言语言 JavaScript是一门弱类型、动态性、解释型语言 typescript是一门强类型、静态型、编译型语言 Java是一门强类型、静态型、编译型语言 变量大小写区分 html css sql java javascript python typescript c 弱类型语言和强类型语言 强类型语言也称为强

    2024年02月09日
    浏览(48)
  • 8086 汇编语言知识点梳理

    机器语言是机器指令的集合 机器指令是一台机器可以正确执行的命令 机器指令由一串二进制数表示 汇编语言的主体是汇编指令 汇编指令是机器指令便于记忆的书写格式 汇编指令是机器指令的 助记符 汇编指令:机器码的助记符,有对应的机器码 伪指令::没有对应的机器

    2024年02月08日
    浏览(54)
  • 【C语言】指针知识点笔记(2)

    目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

    2024年01月18日
    浏览(43)
  • 单片机----汇编语言入门知识点

    目录 汇编语句的格式 汇编语句的两个基本语句 子程序的调用 查表程序设计 1.x和y均为单字节数的查表程序设计 2.x为单字节数y为双字节数的查表程序设计 3.x和y均为双字节数的查表程序设计 分支转移程序设计 1.单分支选择结构 2.多分支选择结构 循环程序设计 (1) 计数循环控

    2024年04月28日
    浏览(48)
  • 【详解】C语言冷门知识点之--位段

    下面是维基百科对位段的解释:   位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的好处: 可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重

    2024年02月16日
    浏览(41)
  • C语言指针入门学习、知识点梳理(四)

    本篇内容:指针星号的三种含义以及指针在函数调用时,与实参、形参的变量传递关系,如何通过被调函数修改主调函数普通变量的值。 传送门: C语言指针入门学习、概念梳理(一) C语言指针入门学习、概念梳理(二) C语言指针入门学习、知识点梳理(三) C语言指针入门

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包