calloc、realloc、malloc

malloc和free

      前提概要

              C函数库中的malloc和free分别用于执行动态内存分配和释放

               以上两个函数在头文件stdlib.h中声明

     函数原型

             void *malloc ( size_t size );

              void free ( void *pointer );

 

     malloc函数

           作用

                 在内存的动态存储区中分配一个长度为size的连续空间

          传参

              无符号整形数

          返回值

              指向所分配连续存储域起始地址的指针

         注意

             函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针,在调用该函数时应该检测返回值是否为NULL,确保非空之后再使用非常重要

             malloc所分配的内存是一块连续的空间

             malloc实际分配的内存空间可能会比你请求的多一点,但是这个行为只是由编译器定义

             malloc不知道用户所需内存存储的数据类型,故malloc返回一个void *的指针(可以转换为任意类型指针)

free函数

       前提概要

             内存空间有限,不能无限制分配内存,故程序要尽量节省资源,当分配的内存空间不用时,需释放

       作用

             释放指针(传参值为指针)指向的内存空间

       传参

             传参可以是 NULL,或者 malloc、relloc、calloc 返回值

            传参为NULL不会产生任何效果,但不会报错

calloc和realloc与malloc的区别

     calloc和realloc的原型

               void *calloc ( size_t num_elements, size_t element_size );

               void *realloc (void *ptr, size_t new_size );

       calloc和malloc区别

             calloc返回内存空间指针前,会将内存空间初始化为0,malloc不会初始化(有时需要用memset进行初始化)

             传参方式不同,calloc的参数包括所需元素的数量和每个元素的大小,再根据两个值换算进行内存空间分配

      realloc函数

            作用

                 用于修改原先已分配内存块的大小,可使一块内存扩大或缩小

            传参说明

                  当传参*ptr为空,即*ptr = NULL,则同malloc

                  当传参*ptr非空

                        若nuw_size < size,即缩小*ptr所指内存空间,该内存块尾部部分被拿掉,剩余部分空间的内容依然保留

                       若nuw_size > size,即扩大*ptr所指内存空间,如果原先内存尾部有足够的扩大空间,则直接在原先的内存块尾部新增内存,如果原先的内存尾部空间不足,或原先的内存块无法改变大小,realloc将重新分配另一块nuw_size大小的内存,并把原先那块内存的内容复制到新的内存块上,因此,使用realloc后就应该改用realloc返回的新指针

          注意

                realloc分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用

参考例程

   int *p1,*p2; 
   p1 = (int*)malloc(size * sizeof(int));
   p2=p1; 
   ……   
   free(p1);  /*或者free(p2)*/

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值