动态内存详解(malloc,calloc,realloc,free函数详解)

首先我们要清楚为什么要学习动态内存呢?

动态内存详解(malloc,calloc,realloc,free函数详解)_第1张图片

   比如我们用一个数组arr[100]={0};这时我们会用下100个整形吗?实际上我们一般也就用10到20个整形,但是你向内存里申请了100个内存整形,那么剩下的空间不就浪费了吗?咱们作为一个合格的程序员,咱们必须能省则省,这个时候我们就可以用到动态内存。 

   所谓动态内存就是我想你用多少内存,你就用多少内存,甚至用不够了再加都是可以的,那么这里就不得不提出动态内存函数,首先请出我们的第一个嘉宾——malloc。

动态内存详解(malloc,calloc,realloc,free函数详解)_第2张图片

    首先我们来看molloc返回的是一个void*的指针,那么这也就意味molloc是要强制类型转化的,size_t size是申请字节数

动态内存详解(malloc,calloc,realloc,free函数详解)_第3张图片

 

     如图,molloc这里申请了一百个字节·,也就是25个整形,用一个int* 的指针保存起来,那么molloc也要强制类型转换成int*的,当然molloc可以随便申请字节,只要把molloc()括号里的数字改了就行。比如申请50个字节就改成50就行,那么molloc函数申请空间有没有可能失败呢?当然有可能,比如申请一个亿的字节,内存都没有一个亿?你拿什么申请?那么molloc申请失败的时候就返回NULL,那么我们就养成一个习惯,来判断返回的是不是空指针?

动态内存详解(malloc,calloc,realloc,free函数详解)_第4张图片

   不然不判断的话,你又怎么是不是申请成功呢?

   还有一个malloc申请内存是没有初始化的,也就是地址里的值是随机的。

动态内存详解(malloc,calloc,realloc,free函数详解)_第5张图片

动态内存详解(malloc,calloc,realloc,free函数详解)_第6张图片 

   看这两张图,malloc开辟的空间用p来接受,我们用循环让p+i这个变量来一个个跳过p指向的地址然后打印地址里的值我们会发现是随机的。

  那么malloc这个函数已经讲完了,我们来讲一下calloc这个函数,这个函数也是申请空间,我们来简单看一下

动态内存详解(malloc,calloc,realloc,free函数详解)_第7张图片

  首先calloc这个函数返回值跟malloc的返回值是void*,也就意味着calloc 这个函数的返回类型往往也是要强制类型转换的

动态内存详解(malloc,calloc,realloc,free函数详解)_第8张图片

动态内存详解(malloc,calloc,realloc,free函数详解)_第9张图片 

   来看下calloc的函数参数,首先看图,第一个是申请的元素个数,第二个是申请元素的字节大小,比如int* ptr = (int*)calloc(10, sizeof(int));其实就是申请了40个字节,那么calloc这个函数也有可能申请失败空间,失败了会返回空指针,所以还是要判断是不是空指针的

动态内存详解(malloc,calloc,realloc,free函数详解)_第10张图片

    因为是用一个int*ptr指针接收的,所以直接判断ptr就ok。

   那么calloc跟molloc函数也有一个很大的区别,那就molloc这个函数它申请的空间是不初始化,而calloc这个函数申请空间则是要全部初始化为0的,什么你居然不信我这个超级无敌帅的代码老师,看来我只能打印给你们看了动态内存详解(malloc,calloc,realloc,free函数详解)_第11张图片

动态内存详解(malloc,calloc,realloc,free函数详解)_第12张图片

  哎,怎么样?服不服我这个大帅哥。

  那要是malloc申请的一百个字节用完了呢?我还想再用,怎么办呢?这个时候该怎么办呢?那么这个时候就要有请realloc,realloc说:“无所谓,我会出手!”

动态内存详解(malloc,calloc,realloc,free函数详解)_第13张图片

    首先来看realloc使用时要用一个之前开辟过malloc或calloc的指针来做,也就是使用realloc这个函数必须前面有malloc或calloc,那么这个函数怎么用呢?

动态内存详解(malloc,calloc,realloc,free函数详解)_第14张图片

 没错,当malloc开辟的空间用完了还想用,直接用开辟malloc的那个指针做第一个参数,后面跟要添加的字节数就行了。

动态内存详解(malloc,calloc,realloc,free函数详解)_第15张图片

  realloc增加空间还有两种情况,第一种是添加的空间内存中足够的空间可以扩容,那么直接加,并且返回旧的地址。

   第二种,如果后面没有足够的空间可以扩容,那么这个时候realloc会在内存中找一个足够你扩容的空间,并且把旧地址的数据拷贝到新空间的前面,并且旧地址的数据释放掉。那么realloc有没有可能扩容失败了,有啊,失败也返回NULL,所以又要判断空指针了。

动态内存详解(malloc,calloc,realloc,free函数详解)_第16张图片

 那么好,申请完内存我们最好释放一下,不然会出现内存泄漏,这时候就要用到free这个函数,

free这个函数使用起来其实也非常简单

动态内存详解(malloc,calloc,realloc,free函数详解)_第17张图片

 如图,你要释放ptr2开辟的地址直接free(ptr2)就可以了,不过要注意释放只是将这块空间还给系统,但是里面数据是没有删除的,所以为了下次使用这次空间不受影响,所以还要将baptr2置为NULL;

欧克,今天的课就讲到这里,我是大家超级无敌帅的代码老师,我们下期见吧,要是觉得这篇文章对你有用点个赞吧,码字不易。

 

 

 

 

你可能感兴趣的:(数据结构,c++,开发语言,缓存)