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

相关推荐
LDR0069 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术9 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园9 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob9 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享9 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.9 天前
C语言--day30
c语言·开发语言
玖玥拾9 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..9 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽9 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下9 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php