动态内存管理(C语言)malloc calloc realloc详解

我们知道,在内存中大概可以分为,系统占用区,栈区,堆区,常量区(常量区又可以分为已初始化常量区,和未初始化常量区),还有就是代码段

我们今天主要介绍的是动态内存管理,而动态内存管理中常用的函数就是操控的是堆区的空间

ca56b0daf36e41cba5720a381bb6955c.png

 我们可以看到如上图所示,堆是向上增长,而栈是向下

我们今天交钱的函数就是操控堆区的空间

我们来看一下今天介绍的函数,malloc,calloc,realloc,free

其中free是个另外三个搭配使用,既然有主动的申请空间,那么用过之后当然得还回去,所以free就是释放空间,把空间还给系统

开始介绍今天的函数

第一个malloc

8d8fc4ce3ab9443299b3c26addff8926.png

我们先看一下他的参数和返回值,参数是一个大小,指的是开辟多少个字节的空间,而开辟好后,把这个空间的起始地址返回,由于不知道使用者想要的是什么类型,所以返回值是一个空指针

我们简单的看一下用法

 f3df5c4331cb42e5a3b5dd32a0ddc806.png

我们调用malloc函数,然后开辟10int类型大小的空间,由于malloc返回值是一个void的指针,所以我们强制类型转化一下,让他成为我们所需要的类型

下面我们在看一下如何使用

0f9a0ff4d72f40b38c7c1824df74bf57.png 

我们开辟好内存后,将每一个位置都赋值,然后再打印一遍

f379753baf1d4dad8db9b2f6fa708fbe.png 

我们可以看到,我们可以使用这块空间

下面我们看一下calloc6191613ffc214e55af7a19a73330176e.png 

calloc的参数多了一个num,其中num的意思是开辟多少个空间,size的意思是每个空间的大小我们下面看一下怎么样使用

 0566983216814fa0958a3cb6116c6798.png

 我们可以看到,如上图所示,那么我们在打印一下里面的值有什么区别

71f2a573c20544b0b82ce5f07b86fe48.png

 我们可以看到都是相同的,那么malloc和calloc两个函数除了参数有一点差个那么其他还有区别吗?

我们下面看一下

cf190e2fea11438eb5b863db7304836a.png

 我们先看一下malloc,我们调试来看,我们申请了四十个字节的空间我们监视看一下

9a825e0766144033a49a13f7f4cc62b6.png

 申请出来后里面的值是内存中的随机值。

那么我们看一下calloc

5f73344f59e045f79d79f32c5a39f846.png

 a9f3212900b8409f9cf644d4ec078bab.png

 我们可以看到calloc申请的内存被初始化为了0,所以他们除了参数有区别还有就是calloc多了初始化

下面我们在看一下realloc

5fc8143e3b514d8e9cbddfbd6e4f3517.png

 realloc的参数是一个空类型的指针,还有一个就是大小,而这个函数的作用是,把一块空间修改大小,而size就是想要修改的值

我们来看一下

0e060723124c4e2aa52cfa7323993a30.png

 我们先申请10和整形空间,然后再修改为20和整形空间

我们来看一下

4d06638ab3d64182baea1484b237cae7.png

我们刚开始看到,我们申请的10和整形空间,以及后面没有申请的10个整形空间

7ccf1512bd4a45b08943633cac0350c4.png 

90bd2c0b63e944c98c7fedc3bb5e20ab.png 

而我们realloc修改之后,我们可以看到我们又申请了10和整形空间

这就是realloc,我们最后看一下free

df41c71fe25f4da581431cf49c439aee.png 

free的参数是一个指针,而他的作用就是释放掉申请的空间,所以他是和其他三个函数联合使用的,如果只申请不释放就是内存泄露,如果是服务器的话,最终会导致服务器卡死

d2bd546614d94dfcbf7dba8154b045d5.png 

free使用就是这么简单

今天介绍完毕 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Naxx Crazy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值