动态内存管理相关的四种函数

目录:

  一、为什么有动态内存分配

  二、与动态内存管理相关的各种函数

  1、 malloc

  2、 free

  3、 calloc

  4、realloc


正文:

    一、为什么要有动态内存分配

          在之前的学习中我们们经常使用数组、变量开辟一块固定的内存空间,但是当实际的需要中可能我们并不知道到底需要多大的内存空间,只有在程序运行时才会知道。那么如果空间开小了,不能满足需求;如果空间开大了造成空间的浪费。因此,C语言引入了动态内存开辟,使得程序员自己可以申请和开辟空间。

         那么如何实现对内存的动态开辟呢?

    二、与动态内存管理相关的四种函数

      1、malloc

                C语言提供了一个动态内存开辟的函数:malloc,使用时需要调用<strlib.h>

    

       这个函数会向内存申请开辟一块连续可用的空间,并返回指向这块空间的指针。

       因为是void*类型,所以malloc并不知道会开辟什么样的空间,这时需要程序员加以控制。

   malloc 函数返回的是 void * 类型,如果你写成:void* p = malloc (sizeof(int)); 语法上是正确的但是程序无法通过编译,不能将 void* 赋值给 int * 类型变量

这里因为我们(程序员)想要开辟容纳10个整型的空间,所以我们可以强转类型,让计算机知道“这块空间存了10个整数”。

       如果函数开辟成功,函数会返回指向被分配空间的指针,如果分配失败则会返回NULL。

       所以malloc的返回值是必须要检查的。

      

2、free

    在使用malloc函数时,动态分配的空间开辟好后。当我们使用完了,是不是要将空间释放掉呢?

     实际上,malloc函数申请的空间有两种释放形式:

      1、使用free()主动释放

      2、程序退出后malloc申请的空间也会被操作系统回收,但这是被动的释放

     看似我们不主动释放也没有什么关系,但是malloc申请的空间被操作系统回收是在程序退出之后,那么如果程序一直不退出呢?所以一定要free主动释放掉。

    那么free如何使用呢?

      

    C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的,使用函数时同样要调用<stdlib.h>。

   值得注意的是:

          free函数只能释放动态开辟的函数,如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。

         如果指针为NULL指针,则函数什么也不会做。

注意!free(p)后,应当将指针置为NULL指针。为什么呢?

3、calloc 

     与malloc相同,calloc也是用来动态开辟空间的。实际上malloc与calloc的使用也并无什么不同

与malloc的区别是: calloc函数使用需要传递两个参数,一个参数是要开辟的个数,一个参数是申请的空间有多大。(但是这好像就是将malloc一个参数拆分为俩)

   实际上,calloc与 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0;

  所以,malloc与calloc我们想用哪个就用哪个,但是当我们开辟的空间需要初始化时,我们就要使用calloc。

4、realloc

     realloc就是将空间再开辟的意思,当我们开辟的空间不和我们的心意时,我们就可以使用realloc函数做到对动态开辟内存大小的调整。

    realloc的使用也是需要调用<stdlib.h>,需要传递两个参数:ptr即要改变的内存地址,size即要改变的大小。返回值为调整之后的内存起始位置。

   为什么返回值是调整之后的内存起始位置?返回原先的指针不行吗?

   不行,原因是:这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间

   realloc在调整内存空间的是存在两种情况:

  1、原有空间之后有足够大的空间

       当空间足够大时,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

  2、原有空间之后没有足够大的空间

      

       原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小
的连续空间来使用。这样函数返回的是一个新的内存地址。同时把原先的数据拷贝过来并将原内存空间释放掉。

        
 因为realloc如果开辟失败,返回的是NULL,所以我们不能直接使用指针p来接收。如果开辟失败,原有的数据会丢失,这是我们不呢允许的。所以我们另外定义一个指针ptr,如果realloc开辟成功就将指针ptr赋给指针p。

 

  • 32
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值