内存函数就是对内存操作的函数,包含四个函数,并且四个函数都是作用于堆区
![](https://i-blog.csdnimg.cn/blog_migrate/f736d211dffcac895494aaab21c57f32.png)
malloc函数和free函数
(void*)malloc(所需空间大小)
malloc就是向内存申请一块空间,空间的内容是随机值,空间的大小是根据你填入括号中的数字大小决定,单位是字节,而返回的指针就是所申请空间的起始位置,但是由于返回的指针是(void*)类型,所以我们接受指针时需要将指针强制类型转化为我们所需要的类型。但如果开辟空间失败,将返回空指针,所以一般情况下,我们需要对返回的指针进行判断。并且malloc开辟的空间是一块连续的空间。
使用示例
![](https://i-blog.csdnimg.cn/blog_migrate/d5f33615abadbdaf5f0af7439052cda6.png)
对于这块空间而言,如果不主动进行回收,就会在程序结束后还给操作系统,而一般情况下,我们需要在使用完这块空间后就主动还给系统,此时就需要使用free函数,free函数就是将空间释放(将原本内存的值再次赋成随机值,但是再通过指针访问会产生越界访问)。但是由于free函数不会将指针赋为0指针,所以我们要主动将指针置为空防止越界访问(free只会释放动态开辟的空间)。
free(所要释放空间的指针)
使用示例
![](https://i-blog.csdnimg.cn/blog_migrate/1accf62e49abed057ba47b64553299e7.png)
总结
![](https://i-blog.csdnimg.cn/blog_migrate/30ec0c451b1c12abd7ab5b8d23caa6d9.png)
两个函数的头文件都是<stdlib.h>。
2.calloc函数
calloc函数与malloc函数相似,区别是后者直接传你所需要的空间,前者是先传入所需类型的个数,后传入所需类型的字节,并且calloc函数是将返回的空间内容置0,而malloc不会,所以前者的效率低于后者。calloc(元素个数,元素大小)。
![](https://i-blog.csdnimg.cn/blog_migrate/6040b5c7fab094030defe00d8abfe6e4.png)
头文件也为<stdlib.h>。
realloc函数的使用
realloc函数就是将malloc函数和calloc函数开辟的空间再次进行调整(扩大),realloc函数如果扩容失败会返回空指针,如果成功会返回空间起始地址(void*)类型,而传入的参数是调整后的总空间。
(void*)realloc(原空间的起始地址,调整后的总空间)。
而扩容的方式有原地扩容和异地扩容,当指针后面的空间的大小小于所需的大小,就会产生异地扩容,会在堆区找一块足够大小的空间,在将原来的数据移到现在的空间,将原来的空间释放,返回现在空间起始地址的指针。原地扩容是原地址后面空间的大小大于所要扩容的空间,就直接在原来空间处扩容,返回原来空间的起始地址指针。
![](https://i-blog.csdnimg.cn/blog_migrate/498f99b771de5d4993a616ed0fd10c48.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b62e9de252599bf3ed7b471fba5ebd88.png)
但由于可能存在扩容失败的情况,所以最好不要使用原来的地址接受,可以增加一个新指针来接收,判断新指针不是空指针后再进行将值赋为原指针。不然直接用原指针接受后可能使得指针变为空,使数据丢失。