C语言:动态内存管理【上】

news2024/11/7 13:41:29

在这里插入图片描述


一. malloc

C语言提供了一个动态内存开辟的函数:

1 void* malloc (size_t size);

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

动态内存分配:主动申请,大小调整,释放。灵活 — 容易出错。

当我们想要用这块空间放10个整型,我们要以整型的视角来看待这块空间,所以我们要整型指针来接收它,如果想要这40个字节放字符,我要用char*字符指针来接收。

在这里插入图片描述

对malloc返回值检查:

在这里插入图片描述

perror是来打印错误信息的。

我们画图来看它们所分配内存空间在什么地方。
在这里插入图片描述

#include<stdlib.h>
malloc函数使用需要头文件

我们来看怎么使用这块空间,给它值,并打印出来。

在这里插入图片描述
在这里插入图片描述

有没有开辟空间失败的情况吗?

在这里插入图片描述

这是x86环境下的,但是当是x64环境下的它是可以的,因为64位环境能够管理的内存是特别特别的大的。

在这里插入图片描述

并没有出错。但是也是有失败的时候。

在这里插入图片描述

但是我们不能光申请,不用的时候,不能不管啊,我们将要进行的操作就是释放。当我们申请一块空间,用完之后,我们要还回去的,这样当别人申请空间的时候给别人用。那我们该怎么来释放呢?这个时候我们来讲free函数


二.free

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

1 void free (void* ptr);

free函数用来释放动态开辟的内存。
. 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
. 如果参数ptr是NULL指针,则函数什么事都不做。
malloc和free都声明在stdlib.h头文件中。

它的参数ptr一定要是开辟空间的起始地址。

我们来看怎么用

在这里插入图片描述

free之前p里面的地址

在这里插入图片描述

free之后p里面的地址,并没有发生改变。

在这里插入图片描述

所以free这个动作不会让p发生变化的。free的意思是把这块申请的空间还给系统了,但是这块空间还是存在的,我们通过p地址还是可以找到这个空间的。

我们想要彻底断开,要给p赋值一个空指针,这样做是非常有必要的,如果不给它空指针,p就变成野指针了。

在这里插入图片描述

动态开辟的空间,如果你忘记释放,当程序结束的时候,操作系统会主动回收这块空间。如果你不释放,程序又不结束,这块空间一直被占用下去,它的利用率就降低了

在这里插入图片描述
在这里插入图片描述

从上例子来看,free不能释放那些非动态开辟的空间,会出现问题的。


三. calloc

C语言还提供了一个函数叫 calloc,calloc函数也用来动态内存分配。原型如下:

1 void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为size 的元素开辟一块空间,并且把空间的每个字节初始化为0。与函数malloc的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0

我们来简单写代码看一下怎么来开辟空间的。

在这里插入图片描述

我们也要判断calloc是否开辟空间失败,并用完时要用free释放,将p指针赋值为空指针。

在这里插入图片描述

我们来看开辟的空间是否被初始化为0。

在这里插入图片描述
在这里插入图片描述

当我们用malloc函数时,看它开辟的空间初始里面是随机的。

在这里插入图片描述

所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。


四.realloc

realloc函数的出现让动态内存管理更加灵活。

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

函数原型如下:

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

ptr 是要调整的内存地址. size 调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
realloc在调整内存空间的是存在两种情况:

情况1:原有空间之后有足够大的空间
情况2:原有空间之后没有足够大的空间

我们先将这个函数用一遍。

在这里插入图片描述

这个时候我们来看realloc怎么工作的,它有两种情况。
在这里插入图片描述

情况1

当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

情况2

当是情况2的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。

由于上述的两种情况,realloc函数的使用就要注意一些。

realloc在第二种情况中的动作:1.找新的满足大小的空间,开辟好。
2.旧空间的数据,拷贝过来。
3.释放旧的空间。
4.返回新的空间的地址。

情况3:失败了。所以我们不能用p来接收realloc返回的地址,如果失败了,p就变成了空指针,我们连以前的地址都找不到了,我们可以创建一个新指针ptr。

我们还是要判断是否可以为空指针,若不是,我们将ptr赋值给p,还是用p维护,因为我们之前用的一直都是p。我们来看完整代码:

在这里插入图片描述
在这里插入图片描述

其实realloc函数也可以实现malloc的功能,请看代码:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10.24.2024刷华为OD C题型(四) -- 对象list按照多个属性排序

文章目录 最长连续子序列AI面板识别语法知识记录 最长连续子序列 https://www.nowcoder.com/discuss/592408743019589632 if __name__ "__main__":# 获取用户输入# numbers int(input().split(,))# str_arr input().split(,)arr [int(num) for num in input(…

ubuntu 24 (wayland)如何实现无显示器远程桌面

ubuntu 24默认采用的是wayland而非x11&#xff0c;查过文档vnc对wayland的支持不是很好&#xff0c;折腾了好久&#xff0c;弄了一个如下的方案供参考&#xff1a; 硬件条件 需要一个显卡欺骗器或者可以接HDMI口作为视频信号源输出的设备。 将ubuntu的主机的HDMI输出接到该硬…

MATLAB FDATool工具箱入门教程

在数字信号处理领域&#xff0c;滤波器设计是一项基础且关键的任务。MATLAB提供了一个强大的工具——FDATool&#xff08;Filter Design and Analysis Tool&#xff09;&#xff0c;它可以帮助用户轻松设计和分析各种数字滤波器。 本文将带领大家深入了解FDATool&#xff0c;让…

JUC并发编程面试题总结

文章目录 1、创建线程的三种方式2、线程的状态3、线程的上下文切换4、run和start的区别5、sleep和wait区别6、虚假唤醒&#xff0c;精确唤醒7、两阶段终止模式8、多线程下的线程安全问题9、如何解决线程安全问题10、synchornized的原理11、锁升级的机制12、锁消除13、批量重偏向…

<HarmonyOS第一课>给应用添加通知和提醒的习题

无形无名者&#xff0c;万物之宗也。 虽今古不同&#xff0c;时移俗易&#xff0c;故莫不由乎此&#xff0c;以成其治者也。 故可执古之道&#xff0c;以御今之有。 上古虽远&#xff0c;其道存焉&#xff0c;故虽在今&#xff0c;可以知古始也。 天命人, 刷无聊剧本… 本文来…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列&#xff0c;通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的&#xff0c;…

如何查看电脑支持的最大内存数?

① 按一下键盘的win R 键&#xff0c;输入&#xff1a;cmd 然后&#xff0c;点击【确定】&#xff08;或者按一下回车&#xff09; 在黑色窗口输入&#xff1a;wmic memphysical get maxcapacity 如下位置显示为&#xff1a;33554432 然后把这个数字&#xff1a;33554432 连…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

SpringBoot 下的Excel文件损坏与内容乱码问题

序言 随着打包部署的方式的改变&#xff0c;原本正常运行的代码可能带来一些新的问题&#xff0c;比如我们现在使用SpringBoot 的方式生成Jar包直接运行&#xff0c;就会对我们再在Resource下的Excel文件产生影响&#xff0c;导入与预期不符的情况发生cuiyaonan2000163.com 比…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

【论文阅读笔记】VLP: A Survey on Vision-language Pre-training

目录 前言2 特征提取&#xff08;Feature extraction&#xff09;2.1.1 图象特征提取OD-based Region feature / RoIFreeze the pre-trained object detectorsGrid features&#xff08;网格特征&#xff09;CNN-GFsEnd-to-End Training&#xff08;端到端训练&#xff09;ViT-…

【科研绘图】3DMAX管状图表生成插件TubeChart使用方法

3DMAX管状图表生成插件TubeChart&#xff0c;一款用于制作3D管状图表的工具。可以自定义切片的数量以及随机或指定切片颜色。 【版本要求】 3dMax 2008及更高版本 【安装方法】 TubeChart插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中打开即可&#xff0…

CSS浮雕效果

效果图&#xff1a; HTML源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

英飞凌TRAVEO-II MCU能做什么?

概述 英飞凌TRAVEO™T2G微控制器基于ArmCortex-M4(单核)/M7(单核/双核)内核,提供高性能、增强的人机界面、高安全性和先进的网络协议,专为电气化、车身控制模块、网关和信息娱乐应用等广泛的汽车应用量身定制。基于单核和双核操作的强大ArmCortexM系列内核,它提供了最先…

Ant-Dseign-Pro如何去国际化及删除oneapi.json后出现程序直接结束问题的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 移除国际化 什么是国际化 在AntDesignPro当中&#xff0c;国际化就是如果你初始默认使用中文&#xff0c;想要切换英文&#xff0c;我们可以切换到英文模式。同时&#x…

UOS中读取 bitlocker加密的U盘

目前安装的1079专业版本&#xff0c;apt 安装的dislocker版本太低&#xff0c;要安个高点的 git clone https://github.com/Aorimn/dislocker sudo apt install gcc cmake make libfuse-dev libmbedtls-dev ruby-dev cd dislocker cmake . make sudo make install 这时运等l…

RHCE笔记-DNS服务器

一.DNS简介 DNS&#xff08;域名系统&#xff09;是一种互联网服务&#xff0c;负责将我们熟悉的域名&#xff08;比如 www.example.com&#xff09;转换为计算机能理解的IP地址&#xff08;比如 192.0.2.1&#xff09;。这样&#xff0c;当你在浏览器中输入网址时&#xff0c;…

自研小程序-心情追忆

在近期从繁忙的工作中暂时抽身之后&#xff0c;我决定利用这段宝贵的时间来保持我的Java技能不致生疏&#xff0c;并通过一个个人项目来探索人工智能的魅力。 我在Hugging Face&#xff08;国内镜像站点&#xff1a;HF-Mirror&#xff09;上发现了一个关于情感分析的练习项目&…

Admin.NET源码学习(5:swagger使用浅析)

直接启动Admin.NET.Web.Entry项目&#xff0c;会弹出swagger登录验证框&#xff0c;虽然采用Furion简化了项目加载过程及配置&#xff0c;但是学习源码过程就比较恼火&#xff0c;很多设置及功能搞不清楚到低是怎么启用的&#xff0c;本文记录学习Admin.NET项目中swagger的设置…

Pytorch学习--神经网络--线性层及其他层

一、正则化层 torch.nn.BatchNorm2d torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue, deviceNone, dtypeNone)正则化的意义&#xff1a; 加速训练收敛&#xff1a;在每一层网络的输入上执行批量归一化可以保持数据的分布稳…