【C语言学习——————动态内存管理】

文章目录

  • 一、什么是动态内存管理
  • 二、动态内存函数的介绍
    • 1.malloc函数的介绍
    • 2.calloc函数的介绍
    • 3.realloc函数的介绍
  • 三、free函数的介绍

一.什么是动态内存管理

我们知道数据都是在内存中进行储存的,但是如果我们需要调用内存,我们可以通过定义一个变量向内存中申请空间,例如

int a = 0;

int arr[10] = { 0 };

诸如此类的都是通过定义的形式对空间进行开辟。

但是这种调用内存的方式会存在一定的缺陷

1.他们所开辟的大小都是固定的

2.数组在定义申明的时候,必须要指定数组的长度大小,有的时候我们需要的空间大小在程序运行之后才能知道。

所以,动态内存管理的作用就很明确了,是通过一个动态内存函数来对空间进行开辟,从而达到我们想要的一个效果。


二. 动态内存函数的介绍

动态内存函数在使用之前需要引用头文件 #include <stdlib>

1.malloc函数的介绍

malloc函数的一般形式是 void* malloc (size_t size);

void* 是malloc的类型,一般情况下需要对malloc进行强制转换操作,例如(int *)malloc等。

它的作用是向内存中开辟一块内存块,并且返回给一个指向内存空间的指针。

需要注意的是,如果开辟成功的话,则会返回一个指向内存空间的指针。

若是开辟失败的话则会返回一个NULL指针,所以需要对malloc的返回值进行检查

如果size为0,malloc的标准行为是未定义的,这个取决于编译器.

我们通常可以这样来使用malloc.

int main()
{int* p = (int*)malloc(40);//开辟一块大小为40个字节的空间if(p == NULL)//对返回值进行检查.{perror("malloc");return 1;}return 0;
}

这个程序可以理解为int p[10] = { 0 };但是malloc在开辟完空间之后,是不会对内存进行初始化的,会保留一个不确定的值。

2.calloc函数的介绍

calloc的用法和malloc大体相似,但也有些不同。

它的基本形式是void* calloc (size_t num, size_t size);在这里,num是需要分配的元素的大小。size是元素本身的字节大小。

其次,calloc的返回值同样需要检查。

若开辟成功则会返回一个指向空间的指针。

若是开辟失败,则会返回一个NULL指针。

若为0,则返回值就取决于特定的库实现(它可能是也不是空指针),但是返回的指针不应该被取消引用。

通常对calloc的使用格式如下:

int main()
{int* p = (int*)calloc(10, sizeof(int));//开辟一块大小为40字节的空间if(p == NULL)//对返回值进行检查{perrpr("calloc");return 1;}return 0;
}

同样和malloc一样是对内存空间进行开辟,但是calloc在开辟内存空间的时候会对内存空间进行初始化操作。

3.realloc函数的介绍

realloc函数是对内存大小进行重新分配,通常会用于扩容或者是缩进内存空间大小。

realloc的基本形式是void* realloc (void* ptr, size_t size);

这里的ptr是指向需要进行操作的空间的一个指针,类型是根据指针的类型来变化的,size是变化后的空间大小,这里尤其需要注意,并不是需要扩容/缩进的大小,而是扩容/缩进之后的整个空间的大小。

realloc在调整原空间大小的基础上,还会将原来的内存中的数据移动到新的空间。

并且,realloc在调整内存空间上存在两种情况:

1.原有空间之后拥有足够大的空间

若原有空间后拥有足够大的空间,则realloc函数会直接在该空间的后面进行开辟。

2.原有空间之后的空间不足

若原有空间后拥有的空间不足以进行调整,则realloc函数会通过重新开辟一块空间并调整为新的大小,然后通过将原空间内的数据进行拷贝到新的空间内,其次会对旧的空间进行释放,最后会返回一个新的空间地址。

我们通过一个案例来说明一下:

int main()
{int* p = (int*)malloc(40);if(p == NULL){perror("malloc");return 1;}p = realloc(p, 80);return 0;
}

调整前的空间的地址

调整后的空间的地址

 通过以上的对比我们可以了解到空间不足的情况下确实会重新开辟一块空间来进行对内存空间大小的调整。

三.free函数的介绍

在使用free函数前,同样需要引用头文件#include <stdlib.h>

我们通过定义变量对内存进行开辟的方式称为静态开辟内存空间,而我们通过静态开辟的内存会由系统自动进行释放。

但是动态开辟的内存,malloc和calloc开辟的内存空间并不会由系统主动释放,若我们不通过主动释放的话,这块空间很有可能会导致内存泄漏等问题,所以在结束对内存的动态开放之后,我们需要主动对动态开辟的内存空间进行释放。

在这里就需要引进free函数。free函数就是用于释放我们动态开辟的空间。

 它的用法也非常的简单,它的参数就是指向我们动态开辟的空间的那个指针。

例:

int main 
{int* p = (int*)malloc(40);if(p == NULL){perror("malloc");return 1;}free(p);p = NULL;//需要将指针设置为空指针return 0;
}

注意在对内存空间进行free后,需要将指针的大小置为NULL,防止野指针的产生。

同样,如果指针指向的空间并不是动态开辟的,则free函数的行为是未定义的。free函数只针对动态开辟的空间,对于静态开辟的内存空间,free函数的行为是未定义的。

如果ptr的值为NULL的话,则free函数什么也不会做。


 以上就是对动态开辟内存空间的介绍,如果该文对你有帮助的话不要忘记点赞+关注三连一下,欢迎各位佬的关注与支持,顺着网线回去三连!

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

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

相关文章

HTML <p> 标签

实例 以下代码标记了一个段落&#xff1a; <p>This is some text in a very short paragraph</p> &#xff08;在页面下部&#xff0c;您可以找到更多实例。&#xff09; 浏览器支持 元素ChromeIEFirefoxSafariOpera<p>YesYesYesYesYes 所有主流浏览器都…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中&#xff0c;我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例&#xff0c;说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

TCP四次握手为什么客户端等待的时间是2MSL

目录 什么是MSL从第三次握手开始分析总结 什么是MSL MSL是Maximum Segment Lifetime英文的缩写&#xff0c;中文可以译为“报文最大生存时间”&#xff0c;他是任何报文在网络上存在的最长时间&#xff0c;超过这个时间报文将被丢弃。 从第三次握手开始分析 第三次握手服务端…

uniapp跳转到外部链接

// 一、先配置页面 {"path": "pages/webview/webview","style": {"navigationBarTitleText": ""} } // 二、编写页面 <template><web-view :src"src" /> </template><script> export def…

vue3+ts+elementui-plus二次封装树形表格

复制粘贴即可&#xff1a; 一、定义table组件 <template><div classmain><div><el-table ref"multipleTableRef" :height"height" :default-expand-all"isExpend" :data"treeTableData"style"width: 100%…

七、用 ChatGPT 修改简历

目录 一、实验介绍 二、背景 三、小张的简历 四、修改简历的技能 五、修改项目经验 5.1 项目经验

从官网认识 JDK,JRE,JVM 三者的关系

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 是一些大厂面试必问点&#xff0c;要想解决 OOM、性能调优方面的问题&#xff0c;掌握 JVM 知识必不可少&#xff0c;从今天开始&#xff0c;将为大家介绍 JVM 的常用知…

[sqoop]将hive查询后的数据导入到MySQL

一、知识点 export:将Hive的表导入到mysql叫导出 搜了很多&#xff0c;发现sqoop在hive导出到mysql时 1&#xff09;不支持where参数对数据进行过滤。 2&#xff09;不支持指定hive表的方式导出&#xff0c;只能指定Hive目录进行导出。 二、操作 1、在MySQL中建表 creat…

【Docker】Docker应用部署之Docekr容器安装Nginx

目录 一、搜索镜像 二、拉取镜像 三、创建容器 四、测试使用 一、搜索镜像 docker search nginx 二、拉取镜像 docker pull nginx # 不加冒号版本号 默认拉取最新版 三、创建容器 首先我们需要在宿主机创建数据卷目录 mkdir nginx # 创建目录 cd nginx # 进入目录 mkd…

Verilog语法学习——LV9_使用子模块实现三输入数的大小比较

LV9_使用子模块实现三输入数的大小比较 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 在数字芯片设计中&#xff0c;通常把完成特定功能且相对独立的…

Yolov8目标检测

Yolov8目标检测 目录 Yolov8目标检测一、准备数据集二、源码下载配置2.1 下载库2.2 修改配置2.3 训练2.4 验证2.5 测试2.6 模型导出2.7 本地测试 一、准备数据集 Yolov8只支持yolo格式的数据&#xff0c;所以&#xff0c;需要将数据集格式调整为 datasets|images|train|00000…

LeetCode刷题总结 - 面试经典 150 题 -持续更新

LeetCode刷题总结 - 面试经典 150 题 - 持续更新 其他系列数组 / 字符串88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II169. 多数元素189. 轮转数组121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II55. 跳跃游戏274. H 指数380.…

word里的页码问题

一份文档写完&#xff0c;如果需要页码&#xff0c;第一页是封面&#xff0c;封面不需要页码怎么办&#xff1f; 解决&#xff1a;打开页眉页脚&#xff0c;然后把首页不同勾选上&#xff0c;这一页就没有页码了。 目录页&#xff0c;往往要使用罗马数字&#xff0c;其他正文又…

网络传输层协议:UDP和TCP

背景知识 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序&#xff1b; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -…

【用Vscode实现简单的python爬虫】从安装到配置环境变量到简单爬虫以及python中pip和request,bs4安装

第一步&#xff1a;安装python包 可以默认&#xff0c;也可以选择自己想要安装的路径 第二步&#xff1a;配置python环境变量&#xff0c;找到我的电脑->属性->高级 然后将刚刚安装的路径配置到path路径下&#xff1a; 然后cmd 运行 输入python命令&#xff0c;如果出现…

AVFoundation - 音频录制

文章目录 需要调用到麦克风方法,别忘记添加 Privacy - Microphone Usage Description @interface AudioRecorder ()<AVAudioRecorderDelegate>@property (strong, nonatomic) AVAudioRecorder *recorder;@end@implementation AudioRecorder- (void

FFmpeg aresample_swr_opts的解析

ffmpeg option的解析 aresample_swr_opts是AVFilterGraph中的option。 static const AVOption filtergraph_options[] {{ "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,{ .i64 AVFILTER_THREAD_SLICE }, 0, INT_MA…

搭建golang开发环境

这里参考一篇文章&#xff1a; golang环境变量链接&#xff0c;还不错

Python数据可视化工具——Pyecharts

目录 1 简介绘图前先导包 2 折线图3 饼图4 柱状图/条形图5 散点图6 箱线图7 热力图8 漏斗图9 3D柱状图10 其他&#xff1a;配置项 1 简介 Pyecharts是一款将python与echarts结合的强大的数据可视化工具 Pyecharts是一个用于生成echarts图表的类库。echarts是百度开源的一个数据…

【JVM】JVM五大内存区域介绍

目录 一、程序计数器&#xff08;线程私有&#xff09; 二、java虚拟机栈&#xff08;线程私有&#xff09; 2.1、虚拟机栈 2.2、栈相关测试 2.2.1、栈溢出 三、本地方法栈&#xff08;线程私有&#xff09; 四、java堆&#xff08;线程共享&#xff09; 五、方法区&…