前言
在C语言中,除了获取变量的指针这种规矩的内存空间,我们还可以通过函数去申请指定大小的内存空间
动态
malloc
malloc可以申请一块任意尺寸的空间,因为经常一段空间是连续的
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *ptr = NULL;
ptr = (int *) malloc(sizeof(int)); // malloc() 返回一个void *类型指针
if (ptr == NULL) {
printf("获取内存失败");
exit(0);
}
*ptr = 4;
printf("*ptr = %d\n", *ptr);
return 0;
}
Output: *ptr = 4
解析
void * malloc(size_t size)
- 声明一个空指针
- 使用malloc函数申请一个连续空间,尺寸为int类型的长度,并将指针类型转换为int类型的指针
- 判断是否申请成功,若成功则继续,若不成功则退出
- 为ptr赋值
- 输出
可以在 (int *) malloc(sizeof(int))
这里做一个小修改 (int *) malloc(sizeof(int) * 3)
,这样我们就得到一个长度为3的常量数组,可以直接使用数组的方式去操作ptr指针
内存泄漏
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while(1) {
malloc(1024);
}
return 0;
}
如果你尝试在你的电脑上运行这段代码,我可能已经看到你在运行过后的表情会是怎样的了。年轻的我不信邪的做了一把死,结果导致我很多没有保存正在做的文件都要重新来过,如果你不想和我一样,最好找个虚拟机
Warning: Nuclear missile launched! (警告:感应到在途的核打击)
由于C语言并没有GC(垃圾回收机制),所以它并不会主动的被动的释放空间,那么如果我们一直申请空间,并且不去释放它,那么会导致剩余空间越来越小,以至于电脑直接死机
free
那么C语言为了避免这种情况,在stdlib.h
这个C标准库内,有一个 void free(void * ptr) 函数,此函数的作用是释放由 malloc
、calloc
、realloc
这三个函数所申请的内存空间,如果参数是一个空指针,那么不会发生任何变化
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *num;
num = (int *) malloc(sizeof(int));
*num = 10;
printf("num: %d, addr: %p\n", *num, num);
free(num);
printf("num: %d, addr: %p\n", *num, num);
return 0;
}
解析
- 声明一个int类型指针
- 申请一块大小为一个int类型长度的内存块,并转换类型为int指针
- 给num赋值为10
- 输出num的值和地址 // num: 10, addr: 0x7ffff58f5260
- 释放num指针
- 再次输出num的值和地址 // num: 0, addr: 0x7ffff58f5260
free不会改变指针变量本身的值,调用free后它仍然指向相同的内存空间,但是该内存已无效,不能使用,所以建议在free后将指针设置为空指针