动态内存分配函数——malloc calloc recall

一、malloc

1、malloc申请空间,怎么能确定free()一定将申请的字节全部释放呢?
原因:
(1) 有信息头部28字节,在释放的时候向上读取信息,从而确定释放的大小。因此实际申请的空间比申请的大。
(2) 存在下越界,那么在释放的时候遇到下越界则一直释放到那里

2、利用malloc申请的空间越小,其他信息(头部信息28,上越界下越界8,)耗费大。当malloc(0),并不会返回空指针,其他信息占用100%。
3、malloc中容易出现的错误:
(1)没有对申请到的空间进行判空,malloc申请的空间必须判空
在这里插入图片描述

(2)并没有通过malloc申请堆区的空间,就不需要释放
在这里插入图片描述

(3) 释放两次空间,会造成程序的崩溃
在这里插入图片描述
在这里插入图片描述

(4) 对于申请到的堆区的地址不能加一,否则会造成下越界,并且,使得下越界的部分到头部信息。
在这里插入图片描述

(5) 申请空间后,地址指向后会造成越界,应该是
for(int i=0;i<n;i++)
在这里插入图片描述

(6) 不仅范围造成地址下越界,而且指针地址加一,造成下越界
在这里插入图片描述

(7)死循环会造成堆区空间被耗尽
在这里插入图片描述
4、malloc申请内存失败的原因:
(1)内存不足
如果申请不了,则内存不足,如何解决内存不足?
(2)在前面的程序中出现了内存越界的情况,导致malloc()分配函数所涉及的信息被破坏,那么下次使用malloc()申请空间就会失败,从而返回空指针

二、calloc

malloc与calloc相同点都是在堆区申请空间,但是malloc申请到空间之后是以“cd cd cd ……”来进行填充的,而calloc则是对开辟的空间初始化为0
在这里插入图片描述

三、recall(重新分配内存块)

它必须是在malloc或者calloc内存并未释放的基础上进行的。
三中修改情况:
(1)当未分配内存空间足够大,直接在先前空间的后面增加新的空间
(2)未分配空间不足,重新申请一块新扩增大小的空间,将之前的值转移到新的空间,并释放原来的值。
(3)堆内存不足,扩展空间失败
在申请空间失败的时候,会返回空值赋给原来的指针,那么此时会造成内存泄漏。改进方法:
在这里插入图片描述
此外,如果将ip指针变为空指针,也是可以实现的,那么此时的
int* newdata=(int*)recall(ip,sizeof(int)n);
等价于:
//int
newdata=(int*)malloc(sizeof(int)*n)

对于内存的收缩则不存在系列问题

注意:
free(ip)释放一次即可,释放两次程序异常
free一定要置为空,不然存在概率性事件使得程序崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟各

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值