【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,一经查实,立即删除!

相关文章

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

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

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%…

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

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

【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;通常把完成特定功能且相对独立的…

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;如果出现…

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…

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; 五、方法区&…

数据结构与算法基础-学习-27-图之最短路径之Dijkstra(迪杰斯特拉)算法

一、最短路径应用案例 例如从北京到上海旅游&#xff0c;有多条路可以到目的地&#xff0c;哪条路线最短&#xff0c;哪条路线最省钱&#xff0c;就是典型的最短路径问题。 二、最短路径问题分类 最短路径问题可以分为两类&#xff0c;第一类为&#xff1a;两点间最短路径。第…

【ArcGIS Pro二次开发】(54):三调名称转用地用海名称

三调地类和用地用海地类之间有点相似但并不一致。 在做规划时&#xff0c;拿到的三调&#xff0c;都需要将三调地类转换为用地用海地类&#xff0c;然后才能做后续的工作。 一般情况下&#xff0c;三调转用地用海存在【一对一&#xff0c;多对一和一对多】3种情况。 前2种情况…

敏捷项目经理和传统项目经理有哪些区别?

敏捷项目经理和传统项目管理有哪些区别&#xff0c;经常有咱们群里的伙伴们问&#xff0c;敏捷项目经理注重迅速响应需求变化、灵活应变&#xff0c;而传统项目经理更为注重计划的制定与执行。作为项目经理&#xff0c;敏捷也是必要的技能&#xff0c;今天就为大家分享一下敏捷…

Mac上安装sshfs

目录 写在前面安装使用参考完 写在前面 1、本文内容 Mac上安装sshfs 2、平台 mac 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/130156287 安装 参考&#xff1a;https://ports.macports.org/port/sshfs/ 通过port安装 点击啊insta…

【电网异物检测硕士论文摘抄记录】电力巡检图像中基于深度学习的异物检测方法研究

根据国家电力行业发展报告统计&#xff0c;截止到 2018 年&#xff0c;全国电网 35 千伏及以上的输电线路回路长度达到 189 万千米&#xff0c;220 千伏及以上输电线路回路长度达73 万千米。截止到 2015年&#xff0c;根据国家电网公司的统计 330 千伏及以上输电线路故障跳闸总…

经营简报及考核360表格

文章目录 经营简报效果图代码tableObjectSpanMethod.js 考核360委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了&#xff0c;所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…

【数据结构(C++版)】哈希表(散列表)

目录 1. 散列表的概念 2. 散列函数的构造方法 2.1 直接定址法 2.2 除留余数法 2.3 数字分析法 2.4 平方取中法 3. 处理冲突的方法 3.1 开放定址法 3.1.1 线性探测法 3.1.2 平方探测法 3.1.3 双散列法 3.1.4 伪随机序列法 3.2 拉链法&#xff08;链接法&#xff0…

BLE基础理论/Android BLE开发示例

参考&#xff1a;https://blog.csdn.net/qq_36075612/article/details/127739150?spm1001.2014.3001.5502 参考&#xff1a; https://blog.csdn.net/qq_36075612/article/details/122772966?spm1001.2014.3001.5502 目录 蓝牙的分类传统蓝牙低功耗蓝牙 蓝牙专业词汇&#xff…