目录
前言
在C语言中,我们通常使用数组来开辟空间,当使用数组的时候,我们在内存中开辟的大小已经固定了下来,不能在函数运行过程中动态的扩充和缩小,要怎样才能解决这个问题呢?那就引出了这个内容——动态内存
一、动态内存是什么
动态内存是相对于静态内存而言的。所谓动态内存和静态内存指的是内存的分配方式,动态内存是在堆上分配的内存,静态内存是在栈上分配的内存。栈上分配的内存是由系统管理进行分配释放的,堆上分配的内存是由程序员自己管理进行分配释放的。
二、使用步骤
1.malloc的使用
#include<stdio.h>
#include<stdlib.h> //调用malloc函数的头文件
int main(){
int* p = (int*)malloc(10*sizeof(int)); //开辟内存
if(p == NULL) return;
//使用
free(p); //释放内存
p = NULL; //防止野指针
return 0;
}
什么是野指针
指针指向了一块随机的空间,不受程序控制
野指针产生的原因
我们在使用malloc()开辟空间时,要检查返回值是否为空,若为空则开辟失败。如果不为空,则指针指向的是开辟的内存空间的首地址。开辟的空间用free()释放掉后,如果程序员没有对它进行赋空值或其他赋值操作,就会成为一个野指针
野指针的危害
会造成指针崩溃,不好查找错误原因
规避野指针的方法
释放指针后将其赋值为NULL
2.calloc的使用
malloc和calloc函数都是用来申请内存的
calloc的使用与malloc的使用基本一致
#include<stdio.h>
#include<stdlib.h> //调用malloc函数的头文件
int main(){
int* p=(int*)calloc(10*sizeof(int));
if(p == NULL) return;
//使用
free(p); //释放内存
p=NULL; //防止野指针
return 0;
}
calloc与malloc的区别
malloc申请的内存,内存中存放的内容是随机的,不确定的, 而calloc函数申请的内存为默认值,一般为0
3.realloc的使用
realloc对动态内存进行扩容
#include<stdio.h>
#include<stdlib.h>
#include<cassert> //assert函数的头文件
int main(){
int len = 10*sizeof(int);
int* p = (int*)malloc(len);
assert(p != NULL); //断言p不为空
//若内存不足,需扩容
int* q = (int*)realloc(p,2*len); //2倍扩容 20个int
//q为新的内存起点 q指向原来p的地址
//扩容成功后p=q
p = q;
free(p); //释放内存
p = NULL; //避免野指针
return 0;
}
总结
1.每次开辟的内存不用了一定要free掉,malloc和free要成对存在,有几个malloc就要有几个free,与此同时,每释放一个动态内存就要将它指向NULL
2.只有动态创建的内存才能用free把它释放掉,静态内存是不能用free释放的,静态内存只能由系统释放