动态内存管理
我们之前要开辟内存用的方法都是定义变量,比如
但是上述开辟内存的方法有两个特点
1空间开辟大小是固定的
2数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配
malloc和free
c中提供一个动态内存开辟函数
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针
这个函数有四个注意的地方
如果传的参数时负数,因为size_t无符号,所以变为很大的一个数
c中提供另外一个函数free,专门用来做动态内存的释放和回收
每一个动态开辟后的空间要用free释放。
除此之外还有realloc
relloc
realloc函数的出现让动态内存管理更灵活了
realloc能对动态开辟的空间内存大小进行调整
此时就有两个情况
情况1:原有空间之后有足够大的空间
情况2:原有空间之后没有足够大的
情况1 当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。 情况2 当
是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来
使用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。 举个例
子:
常见的动态内存错误
1对NULL指针的解引用
所以要进行空指针判定
2对动态开辟空间的越界访问
3对非动态内存开辟使用free释放
因为定义变量的方法开辟的空间是在栈区上,而动态开辟的是在堆区上
4使用free释放一块动态开辟内存的一部分
5对同一块动态内存多次释放
6动态开辟内存忘记释放