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

相关推荐
kongba0071 小时前
项目打包 Python Flask 项目发布与打包专家 提示词V1.0
开发语言·python·flask
froginwe111 小时前
C 语言测验
开发语言
今夕资源网2 小时前
powershell工具包 安装升级脚本并设置UTF-8 环境快捷方式创建 将powershell的编码默认改为UTF-8
开发语言·utf-8·powershell·utf-8编码·powershell7·powershell5·设置utf-8编码
三品吉他手会点灯2 小时前
C语言学习笔记 - 14.C编程预备计算机专业知识 - 本讲内容概述
c语言·笔记·学习
机器视觉知识推荐、就业指导2 小时前
Qt:真正的门槛不是入门,而是维护
开发语言·qt
爱编码的小八嘎2 小时前
C语言完美演绎8-18
c语言
hhb_6182 小时前
Dylan 语言核心特性与工程实践深度解析
开发语言·c#
无巧不成书02183 小时前
零基础Java网络编程全解:从核心概念到Socket实战,一文打通Java网络通信
java·开发语言·网络
饭小猿人3 小时前
Flutter实现底部动画弹窗有两种方式
开发语言·前端·flutter
三品吉他手会点灯3 小时前
C语言学习笔记 - 15.C编程预备计算机专业知识 - CPU 内存条 硬盘 显卡 主板 显示器 之间的关系
c语言·笔记·学习