动态内存管理

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个函数的使用还是很简单的,但是一定要注意释放动态内存。

相关推荐
Brilliantwxx35 分钟前
【STM32】RTC 完结篇:日期操作、闹钟中断与附录(时间戳 / 闹钟 / NTP)
服务器·c语言·stm32·单片机·嵌入式硬件·实时音视频
学逆向的1 小时前
C 悬空指针
c语言·开发语言·网络安全
·present·13 小时前
CSAPP(lecture 4_01)
c语言·c++
本地化文档17 小时前
llvm-libc-docs-l10n
c语言·github·gitcode·sphinx·llvm·crowdin
Felven19 小时前
B. Collecting Game
c语言
Felven19 小时前
C. Removing Smallest Multiples
c语言·开发语言
水饺编程20 小时前
第2章:Linux 基础,重启命令
linux·c语言·汇编
inrichtt1 天前
第十一课时:串口中断接收与回调函数实战解析
c语言·数据结构·stm32·单片机·嵌入式硬件
潜创微科技1 天前
CH592:集成 BLE 的青稞 RISC-V 无线 MCU
c语言·单片机·risc-v·无线投屏·低延迟·沁恒
学逆向的1 天前
C 可变量参数
c语言·开发语言·网络安全