Skip to content

2.8.3 动态内存申请

2.8.3 动态内存申请

好了,现在我来解释一下上文提到的malloc是什么

首先,我们在编程中经常需要一块能自己微操的内存,而不是由编译器帮你代打

这一块内存,就是存储在堆区中的那部分 连释放都要自己微操

malloc

malloc是最基本的申请内存函数 其声明位于头文件stdlib.h中

也就是说在程序开头要写一个

#include <stdlib.h>

才能使用 malloc 函数。

下面我来讲一下malloc怎么用

malloc()函数默认返回的数据类型为void*,输入值为申请的内存的字节数

比如我写个malloc(30),那就是给我一块30字节的内存

当然,这也有个弊端

比如我要用这块内存存储int数据,但是我一个int是4字节 就算我尽可能填满,那还剩下2字节

所以为什么防止出现这种浪费资源的现象,我们一般这样写: malloc(n*sizeof(int))

这样这一块内存就能存储n个int数据

说完了输入我们再讲输出 我们知道输出的是void*,也就是空类型的指针 而事实上,我们不可能存储一堆棍木 所以我们要把得到的内存转变成我们需要的数据类型

在现代C语言标准中,是允许void*自动转换为其他类型的 但是在现代cpp中,必须做显式类型转换

所以,在两种语言中,就出现了两种写法:

int *p = malloc(sizeof(int));//C语言
int *p = (int*)malloc(sizeof(int));//C++

当然,你在c语言中按照c++的方法来写也没什么问题,而且这其实也是推荐的写法

总之c++中必须要显式类型转换

最后就是,我们得到的这一段内存,其中的数据需要我们自己填入,否则就是错误值

calloc

有人说,malloc太不安全了,一不小心整个错误值出来咋办 没事兄弟,我们有calloc 和malloc作用相似,但是申请好的内存里默认初始值为0 用法: calloc(单位的数量,单位内存的大小) 例如申请一块可以存储10个int数据的内存

int *p = (int*)calloc(10,sizeof(int));

realloc

还有人说,主包主包,我这内存申请完了发现不够用咋办啊 没事,如果你不想中止程序改代码,也可是可以实现的

realloc的返回值类型也是void*类型 realloc有两个参数,一个是内存地址(也就是要修改的部分),一个是要扩容后的内存大小

int * p = (int*)malloc(10*sizeof(int));
int * newP = (int*)realloc(p,11*sizeof(int));//给p多加一个int的位置

free

这是最最最最最最重要的函数 大家在malloc之后,一定!一定!一定!要记得释放内存

虽然现代的操作系统在程序结束的时候会自动回收内存

但是对于长期运行的项目,只malloc而不free导致的后果就是大量内存被占用进而爆掉

那么该怎么用这个函数呢 很简单

free(指针名)

是的,假设我们前面用p接受了malloc的返回值 那么这里我们写free(p)就可以了