1. 引文
我们已经学会了创建内存的方法(就是创建变量)为什么还有动态内存分配内存。

我们使用这种方法开辟空间最大的局限就是空间的大小是固定的,不能随时变换,有时候空间大小是在运行的时候才知道的,那我们开辟的空间就不知道是不是满足了,于是C语言就引入了动态内存管理,让程序员可以自己申请空间和释放空间,这样可以更灵活。
2. malloc和free
2.1 malloc
C语言提供了一个开辟内存的函数-------malloc。

聪明的你肯定想得到,将malloc和free放一起讲,一个是开辟空间,另一个应该就是释放空间,使用malloc函数需要头文件stdlib.h,作用是申请一块连续可用的空间。

成功的话是返回起始位置的地址,失败则返回空指针。
2.2 free

malloc用于向内存申请空间,free专门来是释放空间,我们将两个联合使用一下:

我们通过malloc申请int*指针类型的空间,如果为空指针则打印错误信息,perror使用来打印错误信息的,使用完空间之后,我们要及时释放 可能会导致信息泄露,系统的资源可能会耗尽,所以我们malloc一定要配合free一起使用。

perror是系统或者库函数调试出错时使用的,用于打印出错码;但是会先打印我们输入的字符串。
3. calloc和realloc
既然我们开辟了空间那肯定要分配,这就是我们的两个用于动态内存分配的函数。
3.1 calloc

这个与malloc的区别就是calloc会初始化,所以我们如果对申请的内存空间要求初始化就可以使用calloc函数来开辟空间。

3.2 realloc

realloc用于调整申请空间过大或过小的情况,调整又有两种情况,当原有空间足够大时,我们要拓展内存就直接在这个原有内存上追加空间,保持原来空间的数据不会发生改变;当原有空间没有多余的空间来扩展,那我们就需要在堆空间上找一块合适大小的连续空间来使用,但是这样函数返回的是一个新的地址。
我们来使用一下:

使用calloc来开辟空间,使用realloc来调整空间,完事一定要记得释放空间,并将其赋值为空指针,不然p就是野指针了,可能会导致报错或者是程序崩溃。
4. 常见动态内存的错误
4.1 对NULL指针的解引用操作

这里我们要记得malloc如果申请失败返回的就是空指针,如果你这时候再对其进行解引用那就会发生报错,我们对返回的指针一定要记得判空检查。
4.2 对动态开辟空间的越界访问

在使用时发生了越界访问。
4.3 对非动态开辟内存使用free释放

动态内存开辟到堆区,局部变量是在栈区,不能使用free进行释放。
4.4 释放动态开辟内存的一部分

使用malloc开辟空间,p++向后偏移了4个字节,这时候进行释放就是释放了动态内存的一部分。
4.5 对同一块内存重复释放

这里是释放空指针,如果你忘记了对p进行赋值为空指针,那就是释放野指针了,那就会出问题了。
4.6 动态开辟内存忘记释放

这个我们重点提过了,忘记释放动态内存会导致内存泄漏,一定要正确释放动态内存。
5. 总结
这一文还是很重要的,对于我们后续的数据结构的学习有很大的关系,我们数据结构就是围绕这内存展开的,这4个函数的使用还是很简单的,但是一定要注意释放动态内存。