这里我将会在下面讲述一下,C语言中的动态内存分配,
知识总结:
1.在申请好空间之后,我们必须要释放申请空间,不然会造成内存泄露
2.free在释放内存之后要将内存指针设置为NULL,不然会产生野指针
3.使用动态内存的常见错误:判断指针是否为NIULL,直接引用、开辟内存的越界访问、对非动态内存的free释放、对一块动态内存的多次释放、没有对动态内存的释放,下面有详细的例子
一、动态内存分配的存在必要
我们在使用数组时,一旦声明,它们的内存大小就已经确定,不能改变大小,就可能造成内存不足或者内存浪费的问题。
二、动态内存函数的介绍
2.1 malloc与free
malloc的使用当中我们要知道的:
1.malloc申请的是连续的空间,返回的是该指向该空间的指针
2.开辟成功,即返回该指向该空间的指针,开辟失败,返回空指针,所以在使用前我们需要进行判断
3.返回的指针类型是void*,所以我们在使用当中要强制类型转化为我们使用的类型
4.它的函数参数就是我们要开辟的空间大小,以字节为单位
free的使用:
1.他几乎与动态内存的申请成对出现,专门用来做动态内存的释放
2.如果它的参数是非动态内存的指针,它不会进行操作
2.2 calloc函数
相比malloc函数,calloc函数更加”懂规矩“,
calloc函数
1.它的使用与malloc函数几乎一致,不同的是calloc函数会将开辟的空间初始化为0
2.calloc函数的返回参数同样是void%*指针,
3.他的参数有俩个,是申请num个大小为size的元素空间
2.3realloc函数
它则更加的灵活,便于管理
在使用realloc函数的时候,他的情况也更加复杂
对于情况1:
扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化
对于情况2:
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址
三、常见的动态内存中的常见错误
3.1 对NULL指针的解引用操作
3.2 对动态开辟空间的越界访问
3.3 对非动态开辟内存使用free释放
3.4 使用free释放一块动态开辟内存的一部分
3.5 对同一块动态内存多次释放
3.6 动态开辟内存忘记释放(内存泄漏)
它不会产生错误提醒,但是存有潜在的危险——内存泄露