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)存放全局变量、静态数据。程序结束后由系统释放。
代码段:存放函数体(类成员函数和全局函数)的⼆进制代码。

相关推荐
chenbingjie_c1 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu3 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
实心儿儿3 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶3 小时前
【Java】数据类型与变量
java·开发语言
code斗3 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特3 小时前
【C++进阶】map和set
java·开发语言·c++
lie..4 小时前
30天从零开始学AI应用开发(Day 12):像产品一样稳:流式输出、报错重试、花钱控制
开发语言·人工智能·php
傻啦嘿哟4 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
阿钱真强道4 小时前
20 嵌入式操作系统 | ubus:把自己的程序状态暴露出去
c语言·进程通信·ubus·ubusd·blobmsg
DeepAgent4 小时前
AI Agent 工程实践(49):一次真实优化——从 Agent v1 到 v2
开发语言·人工智能·agent