动态内存管理函数的运用

一.malloc
void* malloc (size_t size);
定义:向内存(堆区)申请一块连续的可用空间,并且返回指向这块空间的地址。
因为存在申请,所以我们需要对其申请的空间进行判定,是否申请到空间。
举个例子

int *p = (int*)malloc(num*sizeof(int));
 if (NULL == p){
  perror("Application failed ");   //错误原因
  return 1;            
 }

这就是一个用malloc申请空间的过程。其中就包括了“申请的空间大小”以及定义的类型(void* malloc (size_t size))
优点:(相对于栈而言)堆上申请变量其可扩展性较高(也就是你需要多少,就可以申请多少),不到导致空间浪费,以及相对于栈区而言,堆区一次可申请的空间相比于栈区较大。
说到了栈区,咱们就来谈谈,咱们写代码朋友都知道,在栈区不需要区申请空间,而是定义一个变量就可以直接用。下面我们就抛出一个理解:
1.在栈区我们不需要申请空间,栈会自动申请自动释放
2.在堆区,我们需要区申请空间,并且我上面提到在栈区空间自动释放,所以在堆区我们还需要释放空间(这个我们在后面文章讲不释放空间的危害)
二.calloc
void* calloc (size_t num, size_t size)
定义:跟malloc相似,只不过calloc会对申请的空间进行初始化
上面我没有谈calloc的内存问题,就是想要放在这里去对比说明
在这里插入图片描述
在这里插入图片描述
这里我们可以通过两幅图进行对比,就可以看出malloc和calloc的区别了,(malloc对申请的空间不做初始化,而calloc会做初始化)这里细心的朋友就会发现第二幅图,不是只申请了12个字节码,怎么初始化的比12个字节还多,这就是我们接下来要谈的,谈这个之间我们先来了解一个我们刚才所说的在堆区要释放空间的函数。
三.free
定义:释放堆区申请的空间。
下面我们举个例子
在这里插入图片描述
这里的红色表示释放的空间,这里也可以看到,(不是只申请了12个字节的空间吗,怎么释放这么多?)。
在谈这个之前,我们再说一点,对于free这个函数,
1.释放空间代表的是不去使用该空间,但是该指针仍然指向该空间,所以这个和让p=NULL有一定的差距。
2.对于堆区而言,不支持整体申请,局部释放的。

int *p = (int*)malloc(num*sizeof(int));
 if (NULL == p){
  perror("Application failed ");   //错误原因
  return 1;            
 }
 free(p);      //正确
 free(p+1);    //错误

3.如果在堆区只申请空间,而不释放,就会导致内存泄漏(可用空间变少),这个也很容易理解,未释放的空间别人也无法申请,就导致可用空间变少。
4.程序退出,空间自动释放
下面我们就谈谈关于这个申请空间中的问题,在刚才的例子中,大家也可以看到,自己实际申请的空间会大于自己需要的空间,我们说说原因:
多出来的空间用于系统管理:比如,我们在free的时候只传了一个起始地址,他是如何释放整个空间的了,这就是多出来的空间在“作怪”。
四.realloc
void* realloc (void* ptr, size_t size)
定义:在申请空间的基础上,去调整空间的大小。
这里说明关于空间调整问题:
将空间调小,这个我们不用提了,直接将数字以及内存地址带入最终返回起始地址,而对于增大空间,这里就会遇到一个问题:
如果该段空间的后面空间已经被别人使用,使得无法在原来空间后面继续拓展怎么半?
拓展方法:在堆空间上另找一个合适大小的连续空间来使用。并且函数返回的是一个新的内存地址。
我们还是举个例子:
在这里插入图片描述
缩小空间,起始地址不变。
在这里插入图片描述
增大空间,其后有可用空间,起始地址不变。
在这里插入图片描述

增大空间,其后可用空间不足(因为增大到4000字节,所以其后空间大概率不足),导致其要在堆空间上另找一个合适大小的连续空间来使用,返回新的地址。
关于动态内存管理,malloc,calloc,ralloc就说到这里,有的地方解释的不够透彻,也希望读者多多探讨,也提前祝大家端午节快乐。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值