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

相关推荐
一只小青团2 小时前
Python之面向对象和类
java·开发语言
qq_529835352 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
景彡先生2 小时前
C++并行计算:OpenMP与MPI全解析
开发语言·c++
量子联盟3 小时前
原创-基于 PHP 和 MySQL 的证书管理系统,免费开源
开发语言·mysql·php
黑听人4 小时前
【力扣 困难 C】329. 矩阵中的最长递增路径
c语言·leetcode
时来天地皆同力.5 小时前
Java面试基础:概念
java·开发语言·jvm
hackchen5 小时前
Go与JS无缝协作:Goja引擎实战之错误处理最佳实践
开发语言·javascript·golang
JeffersonZU6 小时前
Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
linux·c语言·tcp/ip·udp·unix·gnu
铲子Zzz6 小时前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序
小小小新人121237 小时前
C语言 ATM (4)
c语言·开发语言·算法