零.导言
今天,我们来学习动态内存管理的第一个内容:malloc 和 free。肯定有小伙伴好奇,为什么 malloc 和 free 要放在一起讲。这是因为 malloc (动态内存申请)和 free (动态内存释放)是成对出现的,既不能只申请不释放,也不能只释放不申请。
一.malloc的使用方式
创建数组我们都学过,但是当我们想要创建一个大小可变的数组时却会犯难,这是因为我们创造的数组的内存是静态的,不能改变大小,一旦超出数组范围就会越界。
即使是变长数组也不能在确定数组大小后改变数组大小,此时动态内存申请就派上了用场。
动态申请的数组可以任意的改变其大小,作为代价,我们要手动释放动态申请的内存。
malloc使用方法如下:
int capacity = 10;
int* arr = (int*)malloc(sizeof(int) * capacity);
if(arr == NULL)
{
perror("malloc fail!");
exit(1);
}
此处有几个要点要注意:
- 此处的 arr 为 int 类型的指针(int*),其原理已在指针的章节讲过,此处不再赘述。
- malloc 的返回值是 void 类型的指针 (void*),想要让 arr (int*)接收返回值,需要进行强制类型转换,将(void*)转换为(int*)。
- malloc 接收的参数为 (size_t)类型的变量,此参数决定创造的数组的内存空间大小。如此处的 arr 的内存空间大小为 4 * 10 = 40, 可以存放10个整形数据,相当于 arr[10]。
- 动态申请内存可能会失败,此时需要检查动态申请内存是否成功,若不成功,则退出并报错。
二.free的使用方式
当申请了动态内存空间并使用完后,需要使用free函数将申请的空间释放。
操作方法如下:
free(arr);
arr = NULL;
同时别忘了将指针(arr)置为空,防止存在野指针。
三.总结
malloc 和 free 是同时存在的,如果在动态内存申请后,不及时释放空间,会造成空间浪费。也可能造成其他错误。
!!!注意:malloc 申请空间后并不会将数组的数据初始化,需要手动处理!!!
四.相关链接
完