目录
两种申请内存的方式:
1、int a = 10,存放一个值
2、int arr [ ] = { 1,2,3},存放一组值
但是上述开辟空间的方式有两个特点:
1、空间开辟大小是固定的
2、数组在定义的时候,必须指定数组的长度,它所需要的内存在编译时分配
同时,C语言给程序员一种权利,能够动态申请和管理内存空间
动态内存函数的介绍
malloc函数
malloc函数如果申请内存成功,返回申请到的空间的起始地址;如果申请失败,则返回NULL指针
malloc函数申请的空间是怎么释放的
1、free释放,主动释放
2、程序退出后,malloc申请的空间也会被操作系统回收的,被动释放
正常情况下,谁申请的空间谁去释放,如果自己不释放也要交给别人去释放
free函数
free用来释放动态开辟的内存
如果传的是一个空指针,则free什么都不做
free(p)后p就变成了一个野指针,所以要将p设定为空指针
calloc函数
也是用来开辟空间的
num:要开辟几个元素的空间,10
size:开辟的元素一个多大,sizeof(int)
calloc:calloc(10,sizeof(int));
malloc:malloc(10*sizeof(int));
除了参数的区别,calloc函数申请好空间之后,会将空间初始化为0;malloc不初始化
realloc函数
realloc可以做到对动态开辟内存大小的调整
这种写法不太合适,realloc申请空间也可能会失败,失败的时候返回NULL,反而丢失原来空间
realloc(NULL,40)等价于malloc
常见的动态内存错误
对NULL指针的解引用操作
创建指针p指向的一块空间后,必须进行返回值是否为空的判断
对动态开辟空间的越界访问
访问的大小超过空间内存储的大小
对非动态开辟内存使用free释放
非动态开辟内存是在栈区上创建的,不用free释放,否则报错
使用free释放一块动态开辟内存的一部分
释放的时候p必须全部释放,指向起始位置
如果要遍历空间最好重新使用一个指针,不要让起始空间不见了
对同一块动态内存多次释放
动态开辟内存忘记释放(内存泄漏)
内存丢了,资源被浪费