动态内存管理函数malloc,calloc,realloc,free

malloc

函数原型:void* malloc(size_t size);

  1. 这个函数向内存申请一块连续可用的size大小的空间,并返回指向这快空间的指针。
  2. 如果开辟成功,则返回一个指向开辟好空间的指针。
  3. 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查。
  4. 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候决定。
  5. 如果参数size为0,malloc的行为标准是未定义的,取决于编译器。
int main()
{int* p = (int*)malloc(40);memset(p, 0, 40);   //初始化开辟的内存空间为0if (NULL == p){perror("malloc errror");return 1;}int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

输出

0 1 2 3 4 5 6 7 8 9

注意:使用malloc分配空间后,要使用free函数释放空间,否则可能会造成内存泄漏。如果没有使用free,当程序退出时,系统会自动回收空间,但是也可能会造成系统退出前,即系统运行期间的内存泄露,所以使用free函数释放不在使用的空间是必要的。

free

函数原型:void free(void* ptr);

  1. free函数是用来释放动态开辟的内存
  2. 如果参数ptr指向的空间不是动态开辟的,那free的行为是未定义的。
  3. 如果参数ptr是NULL指针,则函数什么事都不做。

举个反例,如下:


int main()
{int a = 0;int* p = &a;free(p);   //p不是动态分配,所以此用法不正确p = NULL;return 0;
}

上述代码执行会报错。

calloc

函数原型:
void* calloc(size_t num, size_t size);

  1. 函数的功能是为num个大小为size的元素开辟一块空间,并把空间初始化为0.
  2. 于malloc的区别只在于calloc会在返回地址之前把申请的每个字节初始化为0.
int main()
{int* p = (int*)calloc(10, sizeof(int));if (NULL == p){perror("calloc error");return 1;}int i = 0;for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

输出

0 0 0 0 0 0 0 0 0 0

realloc

函数原型:void* realloc(void* ptr, size_t size);

  1. realloc函数的出现让动态内存管理更加灵活。
  2. 有时我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间太大了,那为了合理的使用内存,我们一定会对内存大小进行灵活的调整。而realloc函数就可以做到对动态开辟内存大小的调整。
  3. ptr是要调整的内存指针
  4. size是调整后新的大小
  5. 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
  6. realloc调整内存空间存在两种情况:
    情况1: 原有空间之后没有足够大的空间扩容,需要寻找新的内存空间。
    情况2:原有空间之后有足够大的空间进行扩容。
    如下图所示:
    在这里插入图片描述
int main()
{int* p = (int*)malloc(40);if (NULL == p){perror("malloc errror");return 1;}int i = 0;for (i = 0; i < 10; i++){*(p + i) = i + 1;}//扩容int* ptr = (int*)realloc(p, 80);if (NULL == ptr){perror("realloc error");return 2;}p = ptr;//使用for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

输出

1 2 3 4 5 6 7 8 9 10

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

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

相关文章

Facebook AI策略全解:从数据分析到智能推荐的成功秘诀

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动科技发展的核心力量。Facebook&#xff0c;作为全球领先的社交网络平台&#xff0c;正通过先进的AI策略来优化用户体验和平台运营。从数据分析到智能推荐&#xff0c;Facebook的AI策略涵盖了多个方面&…

Git 分支操作全解析:创建、切换、合并、删除及冲突解决

“ 在现代软件开发中&#xff0c;高效的版本控制是确保项目成功的关键。Git 提供了强大的分支管理功能&#xff0c;使得开发者能够独立地进行功能开发、修复 bug 和进行紧急修补。本文将深入探讨 Git 分支的基本操作&#xff0c;包括创建、切换、合并和删除分支&#xff0c;同时…

Linux基础 - yum、rzsz、vim 使用与配置、gcc/g++的详细解说

目录 一、Linux 软件包管理器 yum A.什么是软件包&#xff1f; B.关于rzsz&#xff0c;yum的配置 1.安装 sz&#xff0c;rz 命令&#xff1a; a.执行命令sz可将linux中的文件传输到Windows中 b.执行rz命令可将Windows中的文件传输到linux 2.scp XXX.tgz 用户名另一台lin…

免费高画质提取PPT/Word/Excel中的图片工具

下载地址&#xff1a;https://pan.quark.cn/s/134ccc35b8a2 软件简介&#xff1a; 好不容易搞到一个几十上百MB的ppt&#xff0c;想导出里面的图片进行二次加工&#xff0c;却被ppt超低画质的图片另存为功能劝退&#xff0c;明知里面全是高清图片&#xff0c;走时却是两手空空…

1系-8系铝合金材料的成分特性及应用详解

1系-8系铝合金材料的成分特性及应用详解 铝合金概述 铝合金的定义铝合金是一种以铝为基体&#xff0c;通过添加一定量的其他合金化元素&#xff08;如铜、锰、硅、镁、锌等&#xff09;形成的合金材料。由于合金元素的加入&#xff0c;铝合金在保持铝的轻质、良好导电导热性等基…

langchain入门系列之六 使用langchain构建PDF解析助手

本文将介绍如何使用langchain构建一个pdf解析助手&#xff0c;在此文中你将学习到langchain如何与web应用(fastapi)相结合&#xff0c;向量持久化等知识&#xff0c;话不多说&#xff0c;现在开始。 安装环境 pip install fastapi pip install python-dotenv pip install uv…

漫步者这款耳机怎么样吗?南卡、漫步者、Cleer公认畅销款式测评!

目前市场上开放式耳机品牌众多&#xff0c;选择时需要充分了解&#xff0c;但即便如此&#xff0c;也难以完全避免购买到质量不佳的产品。作为一位专注于数码产品测评的博主&#xff0c;我对开放式耳机有深入的研究。最近&#xff0c;我收到了许多关于漫步者、南卡、Cleer等品牌…

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…

OpenMax算法详解:深度学习中的高效开集识别技术

OpenMax算法详解&#xff1a;深度学习中的高效开集识别技术 在深度学习领域&#xff0c;模型的识别能力往往受限于其训练数据集的范畴。传统的分类模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;或循环神经网络&#xff08;RNN&#xff09;&#xff0c;通常被设计…

第八节:Nodify 编辑器属性

引言 经过前几章的学习&#xff0c;你已经对Nodify框架有了初步的编程思路。当然只局限于这些还完全不够&#xff0c;本章节将阐述各个结构组件的一些常用属性&#xff0c;以便在日后的开发过程中更得心应手。 1、编辑器 平移 简介属性默认值平移功能 控制DisablePanningfals…

100128-批量获取视频音频时长添加到文件名中支持子孙文件夹下操作-UI

程序功使用环境▶适用的系统环境说明&#xff1a;win7以上64位win系统注意&#xff1a;win32位系统/mac系统需要额外定制▶使用期限&#xff1a;无需注册、不绑电脑、无时间限制▶如何安装&#xff1a;不需要安装程序功能说明▶子文件夹穿透&#xff1a;支持▶支持的文件格式&a…

MySQL集群技术详解

目录 一、MySQL在服务器中的部署方法 1.1 编译安装MySQL 1.2 部署MySQL 二、MySQL主从复制 2.1 配置master 2.2 配置slave 2.3 添加slave2 测试&#xff1a; 2.4 延迟复制 2.5 慢查询日志 2.6 MySQL的并行复制 2.7 MySQL主从复制原理剖析 2.8 架构缺陷 三、MySQL…

学习笔记——IP组播——IP组播基本概述

二、IP组播基本概述 IP组播技术有效地解决了单播和广播在点到多点应用中的问题。组播源只发送一份数据&#xff0c;数据在网络节点间被复制、分发&#xff08;PIM&#xff09;&#xff0c;且只发送给需要该信息的接收者。 1、前言 网络中存在各种各样的业务&#xff0c;从流…

EasyCVR视频汇聚平台革新播放体验:WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新&#xff0c;视频监控已经广泛应用于社会各个领域&#xff0c;成为现代安全管理的重要组成部分。在视频监控领域&#xff0c;视频编码技术的选择尤为重要&#xff0c;它不仅关系到视频的质量&#xff0c;还直接影响到视频的传输效率和兼…

企业参与制定行业标准的主要途径有哪些?需要具备哪些条件?

在当今竞争激烈的商业环境中&#xff0c;参与制定行业标准已成为企业提升竞争力、塑造行业地位的重要战略举措。然而&#xff0c;并非所有企业都有能力和资格参与这一重要的活动。要想在行业标准制定的舞台上发挥积极作用&#xff0c;企业需要具备一系列关键条件。 企业参与制…

mapstruct和lombok同时使用时,转换实体类时数据丢失

全局搜一下maps&#xff0c;找到你进行转换的方法 可以看到新建了TswCaseInfoPlus后直接返回了&#xff0c;说明TswCaseInfoPlus没有set方法&#xff0c;或者说编译后lombok没生效 在pom文件中&#xff0c;编译打包插件中将lombok&#xff0c;mapstruct&#xff0c;lombok-map…

3ds Max - 导出顶点色模型

很久之前的笔记&#xff0c;整理归档&#xff1b; 在3ds Max中&#xff0c;给模型添加VetexPaint修改器后&#xff0c;可以给模型&#xff08;顶点色通道R\G\B默认值为255\255\255&#xff09;刷不同颜色的顶点色&#xff08;默认为黑色&#xff0c;即让RGB通道都为0&#xff0…

PY信号和槽

知不足而奋进 望远山而前行 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在使用PyQt进行图形用户界面&#xff08;GU…

jenkins发送html邮件配置步骤与注意事项?

jenkins发送html邮件如何实现&#xff1f;Jenkins的配置方法&#xff1f; 通过jenkins发送html邮件&#xff0c;开发团队可以及时获取构建状态的详细报告&#xff0c;从而快速响应问题&#xff0c;提高工作效率。AokSend将详细介绍jenkins发送html邮件的配置步骤与注意事项&am…

【实现100个unity特效之28】皮毛shader着色器 实现可以用动的毛茸茸毛绒绒效果

效果 文章目录 效果一、内置渲染管线下载支持几只着色器Basic 基本Attributes 属性Force 力Rim Color 轮辋颜色 二、URP下载几只毛发着色器实现的示例Shell 壳Fin 翅片Fur Polygon 毛发多边形Compare 比较Move 移动 完结 一、内置渲染管线 缺点是仅支持内置渲染管线。且无法毛…