动态内存申请和释放

在我们使用很多函数要申请变量空间时,比如像筛选素数,根据题目筛选范围的不同,变量数不同,这是我们如果通过以下方法都会有错误:

void SiftPrime()
{
    int arr[n];//错误,数组长度不能为变量
    int arr[100];//错误,如果筛选范围为1000,会越界,空间大小不合适
}

这些办法都不行,所以我们要申请动态内存来解决未知变量个数申请空间的问题,动态内存申请使用malloc、calloc、realloc

malloc的使用率远高于calloc,它与calloc最大的区别在于它会自动把每个元素初始化为0

①malloc只有一个参数,即要分配的字节数。malloc申请的是连续的动态内存,可以当作数组使用。

int *arr=(int *)malloc(a*sizeof(int));//乘以sizeof就是计算出字节数
char *brr=(char *)malloc(b*sizeof(char));

②calloc两个参数,参数1为要申请元素的个数,参数2为每个元素的长度

int *arr=(int *)calloc(a,sizeof(int));
char *brr=(char *)calloc(b,sizeof(char));

③realloc也有两个参数,参数1为原来的内存,参数2为新的字节数。一般用于内存不够之后扩展内存:

arr=(int *)realloc(2*a*sizeof(int));

注:扩大内存后,一定要更新地址

动态分配的内存有头和尾的信息(自动在每个内存的前后加信息,这部分信息是隐藏的)。前面的信息包括该内存的大小,后面的信息可以使碎片内存被释放后可以拼接成整块。

在申请了动态内存使用以后要进行内存释放,不然会造成内存泄露,内存释放使用free函数,它有一个参数,为需要释放内存的地址,它的头文件为<vld.h>。

free释放内存时可能会崩溃,崩溃的原因主要有四点:(出现的几率与排序一致)

①越界(越界之后把尾信息丢掉了)

♢malloc漏写了sizeof

♢realloc第二个参数为新的字节总长度,写成了刚增加的字节长度

②改变了指针的指向,(p++)→++把首地址改了

③重复释放内存

④释放的不是动态申请的内存

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值