C语言动态内存管理

使用他们这些函数,记得家#include <stdlin.h>

引入动态内存开辟的目的,让我们灵活的申请和释放空间。

malloc、calloc、realloc、free

对malloc来说,使用它时会向内存申请一块空间,并且返回指向这块空间的指针。

当然使用它可能会出现失败的情况,如果开辟失败,则会返回一个NULL指针。
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃
⼰来决定。

calloc函数也是一个动态内存分配函数。与malloc不同的是,参数不同。
函数的具体解释是:给num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.
也正是calloc特有的将申请的内存空间内容完成初始化,因此如果对申请的空间内容有要求时,便可以采用这一种。

对realloc来说对于我们第一次使用malloc或者calloc函数来申请空间后,我们觉得空间不太够用时,我们可以使用realloc函数来进行调整。

这里有几个要注意的点:

ptr是要调整的内存地址,size是调整后大小,返回值为调整之后的内存起始地址。

但要注意的是,realloc在调整内存空间时存在两种情况:

一种是原来的空间之后有足够大的空间,另一种是没有。

使用realloc函数后的空间后,不应该用原有的地址进行接收,应该进行判断,判断是否申请成功新的空间,如果申请成功,再将申请成功后的地址赋给原来的地址,否则如果申请失败,而且用的是原有的地址接收的开辟空间,则可能会来原来的空间都找不到,从而造成内存泄漏。

对free来说,它是用来做动态内存的释放和回收的。

如果ptr指向的空间不是动态内存开辟的,那free函数的行为是未定义的。

如果参数ptr是NULL指针,则函数不做任何事情。

使用这些动态内存开辟函数,他们都是在堆上进行的。
栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时
这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内
存容量有限。 栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。
堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配⽅
式类似于链表。
数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
代码段:存放函数体(类成员函数和全局函数)的⼆进制代码。

相关推荐
LXS_3576 小时前
Day 05 C++ 入门 之 指针
开发语言·c++·笔记·学习方法·改行学it
etsuyou8 小时前
js前端this指向规则
开发语言·前端·javascript
shizhenshide8 小时前
为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
开发语言·php·验证码·captcha·recaptcha·ezcaptcha
mit6.8248 小时前
[Agent可视化] 配置系统 | 实现AI模型切换 | 热重载机制 | fsnotify库(go)
开发语言·人工智能·golang
友友马8 小时前
『 QT 』QT控件属性全解析 (一)
开发语言·前端·qt
小白学大数据9 小时前
实战:Python爬虫如何模拟登录与维持会话状态
开发语言·爬虫·python
一念&9 小时前
每日一个C语言知识:C 结构体
c语言·开发语言
锦***林10 小时前
用 Python 写一个自动化办公小助手
开发语言·python·自动化
GilgameshJSS10 小时前
STM32H743-ARM例程24-USB_MSC
c语言·arm开发·stm32·单片机·嵌入式硬件
小莞尔10 小时前
【51单片机】【protues仿真】基于51单片机电压测量多量程系统
c语言·单片机·嵌入式硬件·物联网·51单片机