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

动态内存

动态内存分配函数:在程序运行时为变量或数据结构开辟的内存空间的函数。

有三个重要的动态分配函数:malloc、calloc、realloc。

 动态内存分配函数

malloc 

这个函数是向内存中申请一块连续的空间,返回一个指向这个块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。
  • 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。 

举一个例子:

 malloc函数只是拿一块连续的空间,也不进行初始化,而且使用完后需要还给内存,这时就需要一个函数:

free

free函数用来释放动态开辟的内存。 

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。 

所以使用动态内存分配函数前需要判断指针是否为空 ,然后在free函数进行释放,最后再置为空指针(不置为空的话,会成为野指针,当调用这个地址时数据也会被使用)。

 

calloc

 calloc函数和malloc函数差不多,唯一不同的就是,calloc开辟的一块空间都置为0

realloc 

这个函数比前两个函数的开辟更加灵活。

  •  ptr 是要调整的内存地址
  • size 调整之后整块空间的大小
  • 返回值为调整之后的内存起始位置。

分两种情况: 

1)在一块空间中,假设ptr开辟的空间后还足够开辟扩大的空间,那就可以直接完后开辟,返回的也是原来的地址。

2)假设后面的空间不够开辟扩大的空间,那么就需要开辟一块足够存放整块空间的大小的新的空间,然后将原先开辟的数据拷贝过去且原先的空间被释放,返回的是一个新的地址。

常见的动态错误

对NULL指针解引用

 在使用动态内存分配函数,不进行指针为空的判断,就解引用赋值程序会警告。

对动态开辟空间的越界访问

 假设开辟了一块空间,但是访问时却超过了这块空间,这就是越界访问程序会崩溃的。

对非动态开辟内存使用free释放

 free函数只能对动态开辟(堆区)的空间进行释放,但是如果不是堆区而是栈区那么程序会崩。

使用free释放一块动态开辟内存的一部分

 free返回的是开辟动态区的起始位置,但是下图在赋值时p的位置就改变了系统就崩了。

对同一块动态内存多次释放

可能在程序中会出现不记得是否写过free函数,所以就会出现这个问题多次释放,这个程序也是会崩的。出现这个问题,可以在每一次的free函数下把指针置为NULL,这样就不会出现问题啦。

动态开辟内存忘记释放(内存泄漏)

大概意思就是开辟空间后没有释放,这个可以是很多种情况:可能是忘记了;又或者是程序运行时不执行free语句在free之前就结束程序;又或者是调用函数是没有释放等等……。

所以开辟了动态内存就一定需要释放。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Obsidian】当笔记接入AI,Copilot插件推荐
  • 函数模板(初阶)
  • C:字符串函数(续)-学习笔记
  • C语言中实现在动态库中访问另一个动态库变量
  • 白月光git
  • 为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白
  • 如何建立一个Webservice WSDL的简单例子(完整例子)
  • java数据结构----图
  • 清华大佬自曝:接到了省烟草局的offer,我就拒掉了华为!结果华为立马给我申请了特殊涨薪,总包70w是烟草的2倍,这可如何是好?
  • SpringBoot+vue集成sm国密加密解密
  • AI学习指南深度学习篇-RMSprop的数学原理
  • 【mechine learning-十-梯度下降-学习率】
  • 微软九月补丁星期二发现了 79 个漏洞
  • k8s 资源管理
  • Git常用命令(记录)
  • ➹使用webpack配置多页面应用(MPA)
  • Android单元测试 - 几个重要问题
  • css选择器
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES2017异步函数现已正式可用
  • IP路由与转发
  • Java多线程(4):使用线程池执行定时任务
  • pdf文件如何在线转换为jpg图片
  • PV统计优化设计
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • spring + angular 实现导出excel
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring-boot 启动时碰到的错误
  • Travix是如何部署应用程序到Kubernetes上的
  • 百度地图API标注+时间轴组件
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于游标的分页接口实现
  • 检测对象或数组
  • 讲清楚之javascript作用域
  • 类orAPI - 收藏集 - 掘金
  • 模型微调
  • 排序算法之--选择排序
  • 我有几个粽子,和一个故事
  • 异常机制详解
  • 你对linux中grep命令知道多少?
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​人工智能书单(数学基础篇)
  • #define,static,const,三种常量的区别
  • (ros//EnvironmentVariables)ros环境变量
  • (zt)最盛行的警世狂言(爆笑)
  • (搬运以学习)flask 上下文的实现
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十三)Flink SQL
  • (转)甲方乙方——赵民谈找工作
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .ai域名是什么后缀?
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)