1. 为什么需要动态内存管理
我们先来看这样一个例子
C语言开辟空间的方式有两个特点
所以开辟空间的方式,就要试试动态内存开辟了
而在C语言中就有几个函数有内存管理的能力
下面来说一下 动态内存管理 管理的是内存中的哪块地方
2.介绍几个动态内存函数
2.1 malloc和free
C语言提供了一个动态内存开辟函数:
头文件<stdlib.h>
C语言也提供了一个专门用来做动态内存的释放和回收的函数free()
头文件 <stdlib.h>
2.2 calloc
C语言还提供了一个和malloc极为相似的函数,来开辟空间。
头文件 <stdlib.h>
2.3 realloc
C语言还提供了一个 比如说之前申请的空间太小了或者空间太大了,进行内存大小灵活调整的函数realloc
头文件<stdlib.h>
realloc 在调整内存空间存在两种情况
下面看这样一段代码
如果按照这样来扩充空间的话可能会造成
所以realloc 使用要这样
int mian()
{
int* ptr = (int*)malloc(100);
if (ptr != NULL)
{
//业务处理
}
else
{
exit(EXIT_FAILURE);
}
//扩展容量
//ptr = (int*)realloc(ptr, 1000);
int* p = NULL;
p = realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
ptr = NULL;
return 0;
}
3. 常见的动态内存错误
3.1 对NULL指针的解引用操作
修改之后
3.2 对动态开辟空间的越界访问
3.3 对非动态开辟内存使用free释放
3.4 使用free 释放一块动态开辟内存的一部分
p到最后就指向了
p必须指向它的起始空间 ,然后再释放空间
3.5 对同一块动态内存多次释放
3.6动态开辟内存忘记释放(内存泄漏)
忘记释放不再使用的动态开辟的空间就会造成内存泄漏、
4.几个经典的笔试题目
1.运行Test会会出现什么错误
修改后
2.
3.
出现的问题就是str没有释放
4.
所以在free后一定要置位NULL
5.柔性数组
C99中,结构中的最后一个元素允许是未知大小的数组,这个叫柔性数组成员
5.1 柔性数组的特点
5.2 柔性数组的使用
int i = 0;
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
//业务处理
p->i = 100;
for(i=0; i<100; i++) {
p->a[i] = i; }
free(p);
5.3柔性数组的优势