当前位置: 首页 > news >正文

动态内存管理之malloc,free,calloc和realloc函数

Hello,各位小伙伴们,小编在这里祝福各位中秋佳节快乐呀,今天让我们来学习一下动态内存管理吧!

引言

像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间,或者使用数组来申请一段连续的空间,但它们的空间大小都是在创建变量的时候确定的!难免会造成空间的浪费或者超出空间大小。为了解决这一问题,设计了动态内存管理。

动态内存管理大大提高的空间的灵活度但也出现了一些新的问题:越是灵活越容易出错!

让我们来学习一下这四种函数吧!

1-->malloc

void*malloc(size_t size);

在进行动态内存开辟的时候,如果开辟成功就会返回一个开辟好空间的指针。如果开辟失败将会返回空指针!

例如:

#include<stdio.h>
int main ()
{int *a = (int*)malloc(40);if(a==NULL){perror("malloc");return 1;//出现错误返回}int i = 0;for(i = 0;i < 10;i++){*(p+i) = i+1;}for(i = 0;i < 10;i++){printf("%d ",*(p+i));}free(a);a = NULL;return 0;
}

要增加一个判断语句来判断a是否为空指针!

2-->free

malloc是用来申请空间的,但申请之后要及时释放!free函数就是专门为malloc来释放空间的。在释放之后,p指向的地址还给操作系统,但源地址仍然可以找到,但p不能在使用了。这样就会1造成空指针,所以在释放之后要对原来的指针变量设为空指针!

但值得注意的是,free所释放的空间必须是动态内存空间不能对非动态内存进行释放!

3--> calloc

calloc也是用来开辟空间的,与malloc有相同的地方。

void*calloc(size_t num , size_t size);

calloc所指向的num为某种类型的个数,size为该类型的大小。

如果要申请5个整型大小的空间

#include<stdio.h>
int main ()
{int *p = (int*)calloc(5 , sizeof(int));if(p ==NULL){perror("calloc");return 1;}int i = 0;for(i = 0;i < 5;i++){*(p+i) = i+1;}free(p);p = NULL;return 0;
}

 与malloc不同的是calloc在申请空间的时候会对所申请的空间进行初始化处理,初始化为0。

而malloc不会对所申请的空间进行初始化处理!

malloc的调试图
calloc的调试图

 4-->realloc

realloc是让动态管理内存更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。

void *realloc(void*ptr , size_t size );

ptr是要调整的地址,size是调整后地址的大小。

同时realloc的调整方式有两种:1、如果后面内存空间足够大,直接在原来的基础上增加内存空间大小

2、如果后面内存空间不够大,则会重新找一块能够满足空间大小的内存,将原来的内容先拷贝进去,然后在后面进行调整。

第二种情况

 

让我们来看看如何具体使用:

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p = (int*)malloc(20);if (p == NULL){perror("malloc");return 1;}//使用int i = 0;for (i = 0; i < 5; i++){*(p + i) = 1 + i;}int*ptr = (int*)realloc(p, 40);//增加5个整型if (ptr != NULL){p = ptr;}else{perror("realloc");return 1;}for (i = 5; i < 10; i++){*(p + i) = 1 + i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

 同时realloc可以实现malloc的功能,将ptr传递空指针就可以啦。

#include<stdio.h>
#include<stdlib.h>
int main ()
{int *p = (int *)realloc(NULL,40);if(p==NULL){perror("realloc");return 1;}int i = 0;for(i = 0;i < 10 ;i++){*(p+i) = i+1;}for(i = 0;i < 10;i++){printf("%d ",*(p+i));}free(p);p = NULL;return 0;
}

OK,今天的内容就到这里啦!祝各位小伙伴们好时节,愿得年年,常见中秋!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flip动画的实现示例demo
  • mysql的zip解压缩版安装
  • 常见的限流算法
  • hnust 湖科大 毕业实习常见问题30问(2021 年7月,V0.9)
  • django orm增删改查操作
  • 从零到一:构建你的第一个AI项目(实战教程)
  • 【算法】差分思想:强大的算法技巧
  • Parallels Desktop 20 for Mac中文版发布了?会哪些新功能
  • uniapp 做一个查看图片的组件,图片可缩放移动
  • 基于C++的成绩管理系统
  • 828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统
  • 基于python+django+vue的外卖管理系统
  • 【python设计模式1】面向对象设计原则
  • 基于springboot+vue+uniapp的驾校报名小程序
  • 工厂模式,策略模式,代理模式,单例模式在项目中的应用
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【css3】浏览器内核及其兼容性
  • 08.Android之View事件问题
  • 30秒的PHP代码片段(1)数组 - Array
  • Android优雅地处理按钮重复点击
  • Angular2开发踩坑系列-生产环境编译
  • Angular4 模板式表单用法以及验证
  • Apache Zeppelin在Apache Trafodion上的可视化
  • canvas 绘制双线技巧
  •  D - 粉碎叛乱F - 其他起义
  • GraphQL学习过程应该是这样的
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java第三方包学习之lombok
  • magento2项目上线注意事项
  • MySQL QA
  • Python爬虫--- 1.3 BS4库的解析器
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 从伪并行的 Python 多线程说起
  • 从重复到重用
  • 计算机常识 - 收藏集 - 掘金
  • 带你开发类似Pokemon Go的AR游戏
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 T2 联合权值
  • #pragma multi_compile #pragma shader_feature
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (苍穹外卖)day03菜品管理
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)React组件、useState、组件样式
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)母版页和相对路径
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .aanva
  • .bat文件调用java类的main方法
  • .java 9 找不到符号_java找不到符号