动态内存管理(下)

简介: 目录:上篇:(3条消息) 动态内存管理(上)_执久呀的博客-CSDN博客 动态函数的介绍: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<stdio.h>
#include<stdlib.h>
int 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<stdio.h>
#include<stdlib.h>
int 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;



目录
相关文章
|
编译器
【动态内存管理】
【动态内存管理】
61 0
|
1月前
|
程序员
动态内存管理
动态内存管理
12 0
|
5月前
|
编译器 C语言
动态内存管理(1)
动态内存管理(1)
41 4
|
5月前
|
程序员 C语言 C++
动态内存管理(2)
动态内存管理(2)
38 1
|
5月前
|
存储 Linux C语言
5.C++动态内存管理(超全)
5.C++动态内存管理(超全)
|
5月前
|
程序员
21.动态内存管理
21.动态内存管理
|
6月前
|
程序员 编译器 C语言
带你彻头彻尾了解『动态内存管理』
带你彻头彻尾了解『动态内存管理』
|
6月前
|
编译器 程序员 C语言
动态内存管理(超详细!)
动态内存管理(超详细!)
56 2
|
11月前
|
程序员 C语言 C++
动态内存管理-2
动态内存管理
46 0
|
11月前
|
程序员 编译器
动态内存管理-1
动态内存管理
53 0