动态内存管理

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

相关推荐
未来之窗软件服务2 小时前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
是隼人7 小时前
buuctf-pwn bypwn(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
T1mzhou8 小时前
ARM64 Linux 6.10内核启动流程6-psci.c和ATF/U-Boot 的电源接口
linux·服务器·c语言
是隼人8 小时前
buuctf-pwn PWN2(整数溢出)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
LuminousCPP9 小时前
数据结构 - 排序(二):快速排序从错误初版到优化版|双指针划分 + 三数取中 + 小区间插入优化
c语言·数据结构·笔记·算法·排序算法
竞赛考级题库9 小时前
202606 青少年等级考试C/C++真题一级 建议答题时长:60min
java·c语言·c++
迷茫、Peanut9 小时前
C语言混合链接
c语言
wdfk_prog10 小时前
RT-Thread Kconfig 配置明明是 y,为什么 rtconfig.h 就是不生成?一次 `_PATH` 后缀踩坑复盘
c语言
是隼人10 小时前
buuctf-pwn jarvisoj_level5(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
Suxing911 小时前
C语言基础分享:C语言文件操作:从“写日记”到“拍电影”的存盘指南
c语言·开发语言