C语言:动态内存管理(malloc,calloc,realloc,free)

目录

前言

malloc函数

free函数

calloc函数

realloc函数


前言

在这一章节将讲解动态内存分配,它可以在程序的堆区创建一块内存,在这块内存中存什么值就是由自己决定的了

开辟的空间有两个特点:

1. 空间开辟的大小是固定的

2. 数组在声明时必须指定长度,数组的大小一旦确定就不能调整

在使用这些函数之前我们需要包含他们头文件

#include<stdlib.h>

malloc函数

该函数的作用是开辟一块固定大小连续的空间,并返回指向这块空间的指针

所以它的返回值为void*

里面的参数size是一个以字节为单位的数字,函数会开辟所给的大小

如果malloc开辟空间成功,则按上面所说返回一个指向这块空间的指针

如果malloc开辟空间失败,则会返回NULL指针

因此使用它时一定要进行检查返回值

如果传的size为0,则具体怎么处理看编译器

具体使用malloc函数的代码如下:

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = malloc(sizeof(int) * 4);if (p == NULL){perror("malloc fail");return 1;}for (int i = 0; i < 4; i++){p[i] = i + 1;}for (int i = 0; i < 4; i++){printf("%d ", p[i]);}return 0;
}

 首先我们定义了一个int* 类型的指针接收malloc的返回值

并且使用了if 语句判断malloc开辟空间是否成功,如果成功则不会进入if 语句进入下面的语句

然后下面的两个for循环就是正常的给空间赋值和打印,最终结果如下:

但是这样做其实还差了点意思,这个程序其实并不完美,存在内存泄漏的问题

假设我们需要一直跑某一个代码,那么我们如果这样一直使用内存不进行释放的话,迟早有一次内存会被吃满,这种现象叫做内存泄漏

所以为了解决这个问题,我们需要使用另一个函数

free函数

 free是专门用来做动态内存的释放和回收的

该函数没有返回值,参数为一个void* 的指针(想了解void*可以看看我前面的博客)

C语言:指针的基础详解-CSDN博客

注:

1. 如果ptr指向的空间不是动态开辟的,则free函数的行为是未定义的(具体处理方式看编译器)

2. 如果ptr是NULL指针,则函数什么事情都不做

所以与上面动态开辟内存的malloc函数结合起来使用,我们在上面写的代码只需要在最后加上一个free函数释放掉这块空间即可

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = malloc(sizeof(int) * 4);if (p == NULL){perror("malloc fail");return 1;}for (int i = 0; i < 4; i++){p[i] = i + 1;}for (int i = 0; i < 4; i++){printf("%d ", p[i]);}free(p);p = NULL;return 0;
}

最后free的参数为p表示释放掉p指向的这块动态开辟的空间

并且我们可以在最后将p置为空指针,以防它变成野指针

calloc函数

calloc跟malloc基本差不多

第一个参数num是需要开辟的空间数量

第二个参数size是每个空间的大小

返回值与malloc一样

calloc与malloc的本质区别就是calloc会将开辟的那块空间的每个字节初始化为0

总结:calloc会初始化,malloc不会初始化

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = calloc(4, sizeof(int));if (p == NULL){perror("malloc fail");return 1;}for (int i = 0; i < 4; i++){printf("%d ", p[i]);}free(p);p = NULL;return 0;
}

 前面的代码我们将malloc换成了calloc,并且将初始化的环节删除了,最终输出结果如下:

可以看到我们并没有给它初始化但是打印出来的结果是0

所以这个函数已经将这块空间给初始化为0了

realloc函数

realloc让动态内存管理更加灵活了

有时候我们会发现申请的空间太小了,有时候又觉得申请的空间太大了浪费,为了合理的使用内存

我们可以使用realloc函数进行调整

第一个参数ptr是要调整的内存地址

第二个参数是调整之后的新大小

 函数返回值为调整之后的内存起始位置

realloc调整空间有两种情况

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

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

如果是情况1则会直接在原来的空间后面直接追加空间,最后返回原来的内存地址

如果是情况2则会在堆空间上另外找一个合适并且有足够大小的空间进行开辟,最后返回新的内存地址 

具体代码如下:

#include <stdio.h>
#include <stdlib.h>int main()
{int* p = malloc(sizeof(int) * 4);if (p == NULL){perror("malloc fail");return 1;}int* ptr = realloc(p, sizeof(int) * 6);for (int i = 0; i < 6; i++){ptr[i] = i + 1;}for (int i = 0; i < 6; i++){printf("%d ", ptr[i]);}free(p);p = NULL;return 0;
}

第一个malloc开辟了四个int类型的空间,若此时我们发现不够,则以下用了realloc调整空间

下面使用了ptr来接收realloc将p指向的空间变成6个int类型的空间的起始地址

最后我们给ptr赋值并且打印,结果如下:


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

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

相关文章

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构 数组链表栈使用场景 队列应用场景 哈希表特点哈希函数&#xff0c;哈希值&#xff0c;哈希冲突键值对 Entry 开放寻址法和拉链法 参考文档 数组 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成&#xff0c;并且是使用一块连续的内存来存储的。 在数组…

python django实战开发序列化器的一个应用心得分享

需求: 查询的时候返回不包括SharePasswd 字段, 但是新增操作需要用到该字段 再不写多个model模型和序列化器的前提下实现 如果您在查询&#xff08;GET 请求&#xff09;时不希望返回 SharePasswd 字段&#xff0c;但在新增&#xff08;POST 请求&#xff09;时需要用到该字段…

Java两地经纬度通过高德api获取两地距离(公里)

代码如下&#xff1a; String startLongitude entity.getLONGITUDE(); // 起点&#xff08;当前位置&#xff09;经度String startLatitude entity.getLATITUDE(); // 起点纬度String endLongitude entity.getLO(); // 终点经度String endLatitude entity.getLA(); …

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解&#xff0c;并且每个知识点基本都会有例子演示&#xff0c;详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前&#xff0c;我们要先知道spring框架在开发时&#xff0c;服务器端采用三层架构的方…

ABNDP: Co-optimizing Data Access and Load Balance in Near-Data Processing——论文泛读

ASPLOS 2023 Paper 论文阅读笔记整理 问题 近数据处理&#xff08;NDP&#xff09;是一种很有前途的体系结构范式&#xff0c;可以解决数据密集型应用程序的内存墙挑战。基于3D堆叠存储器的典型NDP系统包含大量并行处理单元&#xff0c;每个并行处理单元都可以访问其本地存储…

HTML基础:8个常见表单元素的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具&#xff0c;持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…

2024智能EDM邮件营销系统使用攻略

在数字化营销领域&#xff0c;智能EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销作为一种高效、精准的推广方式&#xff0c;正日益受到企业的高度重视。而要实现这一策略的成功落地&#xff0c;一个高可靠性和高稳定性的专业邮件发送平台则是不可或缺的关键环节。…

大数据分析案例-基于决策树算法构建大学毕业生薪资预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

C语言中位运算介绍

在C语言中&#xff0c;位运算是一种对二进制位进行操作的运算方式&#xff0c;它可以对数据的二进制表示进行位级别的操作&#xff0c;包括按位与、按位或、按位异或、按位取反等。位运算常用于处理底层数据结构、优化代码性能以及实现各种算法。本文将深入介绍C语言中的位运算…

两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合

区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕

软件杯 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

鸿蒙操作系统-初识

HarmonyOS-初识 简述安装配置hello world1.创建项目2.目录解释3.构建页面4.真机运行 应用程序包共享包HARHSP 快速修复包 官方文档请参考&#xff1a;HarmonyOS 简述 1.定义&#xff1a;HarmonyOS是分布式操作系统&#xff0c;它旨在为不同类型的智能设备提供统一的操作系统&a…

电脑windows 蓝屏【恢复—无法加载操作系统,原因是关键系统驱动程序丢失或包含错误。.......】

当你碰到下图这种情况的电脑蓝屏&#xff0c;先别急着重装系统&#xff0c;小编本来也是想重装系统的&#xff0c;但是太麻烦&#xff0c;重装系统后你还得重装各种软件&#xff0c;太麻烦了&#xff01;&#xff01; 这种情况下&#xff0c;你就拿出你的启动U盘&#xff0c;进…

2016国赛-路径之谜

分析&#xff1a; 看到n*n以及四个方向移动&#xff0c;那么就直接使用dfs即可。根据题意可知起始位置是(0,0)&#xff0c;终点位置是(n-1,n-1)。 又有要求靶子上的箭数决定了走的路径&#xff0c;那么我们就要加一个判断各个方位的箭数是否符合要求。 示例代码&#xff1a; …

JVM之堆

堆的核心概述 一个JVM实例只存在一个堆内存&#xff0c;堆也是内存管理的核心区域。 Java堆区在JVM启动的时候即被创建&#xff0c;其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。 《JVM虚拟机规范》规定&#xff0c;堆可以处于物理上不连…

Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

盲盒小程序开发,互联网盲盒下的潜在发展优势

近几年&#xff0c;我国潮玩市场经历了爆发式的发展阶段&#xff0c;尤其是盲盒市场屡创新高&#xff01;盲盒商品主打IP衍生品、周边等具有收藏价值的商品&#xff0c;深受市场的追捧&#xff0c;满足了不同年龄群体的需求。面对盲盒的蓝海市场&#xff0c;众多的品牌也纷纷加…

Altium Designer的差分对布线走线技巧及规则设置

AD的PCB页面是有差分对布线的工具的&#xff0c;这种工具的使用首先需要自己添加差分对&#xff0c;才能进行交互式差分对布线&#xff1a; 在原理图中放置差分对标识&#xff0c;其中差分对要以_P和_N结尾来命名&#xff1a; 在原理图中放置差分对&#xff1a; 差分对在PCB中的…

浏览器导出excel

做java web项目时&#xff0c;经常遇到需要在页面上点击导出按钮&#xff0c;然后直浏览器接下载下来一个excel文档。 比如一个List<Person>的集合&#xff0c;需要将每个Person当做一行&#xff0c;输出到excel中去。其中Person实体类如下&#xff1a; import lombok.…