资讯专栏INFORMATION COLUMN

动态内存管理(下)

asoren / 3331人阅读

摘要:函数和函数不同之处在于,函数会将所申请到的内存空间全部初始化成,而函数则不会,这就意味着比运行时间更长,所以在选择这两个函数时可以根据是否需要初始化来选择。切断和已经释放的内存空间的联系。

目录:动态函数的介绍:malloc  free  calloc  realloc

         三、 calloc函数

        calloc函数介绍:

        calloc的使用例子:

四、 realloc函数

        realloc函数介绍:

        realloc函数的使用例子


动态函数的介绍:malloc  free  calloc  realloc

三、calloc函数

函数的参数形式:   void* calloc(size_t num , size_t size )

  其中void*是一个可以接受任意类型的指针,size_t表示的是unsigned int(无符号整型)

num表示的是多少个元素,size表示的是一个元素的大小,单位是字节

calloc函数介绍:

1.  calloc函数也是向内存申请空间的,若是申请成功则会返回一个指向内存首地址的指针,

若是申请失败,则会返回一个NULL(空指针),所以使用该函数也是需要进行判断是否为

非空指针,否则程序会出错。

2.calloc函数和malloc函数不同之处在于,calloc函数会将所申请到的内存空间全部

 初始化成0,而malloc函数则不会,这就意味着calloc比malloc运行时间更长

所以在选择这两个函数时可以根据是否需要初始化来选择。

calloc的使用例子:

#include#includeint main(){     int *ptr=(int*)calloc(10,sizeof(int));//用ptr指针来接受calloc返回的值,申请的空间是40字节      if(ptr==NULL)      {         return 0;//如果没申请成功则直接结束函数。      }       else//为ptr非空的情况      {          for(int i=0;i<10;i++)            {                 int kc=*(prt+i)=i;//将所申请的空间赋值              printf("%d ",kc);//打印每个元素            }                 }            free(ptr);//释放所申请的内存空间,如不则容易导致内存泄漏        ptr=NULL; //ptr还是指向原来所申请的地址,free不会将指针变为空,为了安全手动变为NULL   return 0;}

四、realloc函数

 函数的参数形式void* realloc(void*ptr , size_t num);

 其中void*ptr是要被改变的指针指向的地址,size_t num是改变之后的大小,单位是字节

  realloc函数介绍:

  1.realloc是一个专门用来调整申请动态内存的大小。(也是要和free函数配套使用)

  2.若realloc要扩大申请的空间,如果原始空间后有位置可追加则就在原指针之后进行追加,

   如果不够则另外找一块新的空间来,并且把存在旧的内存里的数据移动到新的内存空间

   并且释放旧的内存空间给操作系统,返回一个指向新的内存地址的指针

  3. realloc改变所申请空间的大小和上述函数类似,若申请失败则返回一个空指针,所以

     要判断所返回的值是否为非空,若为非空指针,则可以*ptr=*p

     (其中*ptr为旧的指针*p为新的指针)  

      注:若是将空指针赋值给*ptr,则原始内容地址将丢失(内存泄漏)  

   4.realloc函数功能较强大还可以实现malloc函数的功能,如 void* realloc(NULL,size_t  size);

       就是只需对NULL进行追加即可,它等价于void* malloc(size_t  size);

realloc函数的使用例子:

#include#includeint main(){   int* ptr=(int*)calloc(5,sizeof(int));//申请了5个int类型的内存,用ptr去接受返回来的指针   if(ptr!=NULL)     { for(int i=0;i<5;i++)         {           int input= *(ptr+i)=i;           printf("%d ",input);         }     }       int*p=(int*)realloc(ptr,40);//原ptr申请为10个int类型     if(p==NULL)//这步判断不可少       {          return 0;//若申请失败则直接退出函数       }     else     {         ptr=p;//将新地址赋给旧的地址         for(int i=5;i<10;i++)              {                 int hi= *(ptr+i)=i;                 printf("%d ",hi);              }     }        free(ptr);//释放申请的内存给操作系统,这步必不可少。        ptr=NULL;//切断ptr和已经释放的内存空间的联系。    return 0;}

祝愿各位小伙伴们学有所成!!!!

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

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

相关文章

  • C++内存管理

    摘要:对于申请内存失败,的处理是返回空指针,而的处理是抛异常对于自定义类型,会调用其构造析构函数,而不会。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 ...

    mudiyouyou 评论0 收藏0
  • 【C语言进阶】动态内存管理/分配

    摘要:栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量函数参数返回数据返回地址等。 C语言动态内存分配篇 目录 一、为什么存在动态内存管理/分配?         内存的存储形式划分 二、动态内存函数的介绍         malloc ...

    Carson 评论0 收藏0

发表评论

0条评论

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