C语言-realloc函数的使用

语法格式

1. `realloc`

函数用于动态地改变之前分配的内存块的大小。其函数原型如下:


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

- `ptr`: 指向之前分配的内存块的指针。如果 `ptr` 为 `NULL`,那么 `realloc` 行为与 `malloc` 相同。
- `size`: 新分配的大小(以字节为单位)。
`realloc` 可以调整内存块的大小,如果新的大小比原来小,那么内存块可能会被移动。如果新的大小比原来大,那么内存块会尝试扩展。如果扩展失败,那么原来的内存块会被保留,只是其大小变为新的大小。`realloc` 返回一个指向调整大小后的内存块的指针。如果调整大小失败,则返回 `NULL`。
在使用这些函数时,应当总是检查返回的指针是否为 `NULL`,以避免潜在的空指针引用错误。并且在使用 `calloc` 或 `realloc` 分配的内存后,应当在不再需要时使用 `free` 函数来释放内存,以避免内存泄露。

———————————————————————————————————————————

realloc函数的使用 

这个函数的代码格式可以理解为 ,你之前malloc或者calloc申请的空间是p指针进行接收的,OK此时你想对这个空间进行空间的扩展,那此时的ptr也就是p指针变量,size也就是你需要的实际空间,这里的空间不是扩展的空间,而是实际的空间
void *realloc(void *ptr, size_t size);

也就是realloc(p,40)

之前我们p开辟的是20的空间 ,这里我们实际需要的是40的空间,这不是再开辟40空间,而是一共40 的空间。

下面解释一下为什么

———————————————————————————————————————————

realloc函数扩展空间的原理

 realloc函数扩展空间几乎就是两种模式

1. 直接在原内存空间的基础上进行扩展内存

2. 把原空间的内存复制到新的内存空间,建立一个更大的内存空间,需要知道的是,只要是进行内存的复制,那么就有可能导致复制失败,从而导致数据丢失。

所以实际使用的时候,我们还是需要进行判断语句的。

 如图1

如图2 

———————————————————————————————————————————

realloc代码解析 

首先我们创建一个空间 ,然后进行调整 

因为这里使用的时候 是有可能导致开辟空间错误,导致地址的丢失,所以我们进行判断,也就是主动的找一个指针变量指向新开辟的地址,只要指向的空间不是空指针,那么也就是可以满足条件,然后进行一个二次赋值

最后,不使用的时候进行申请空间的清理,防止内存空间的泄露

———————————————————————————————————————————

realloc代码 

int main()
{//malloc不初始化开辟空间//开辟20个字节的空间大小 int* p = (int*)calloc(5 , sizeof(int));if (p == NULL){perror("malloc:");//这里是打印错误信息,return 1;}for (int i = 0; i < 5; i++)//这里是打印出来开辟的空间 赋值之后进行打印 {//*(p + i) = i + 1;//这里是进行赋值 赋值从1开始printf("%d ", *(p + i));//这里是打印出来}free(p);//这里进行指针的释放p = NULL;//防止野指针的问题,我们指向空指针//首先我们已经开辟动态内存空间 但是不能满足我们的需求,那么此时我们就用realloc进行空间的扩展//依旧是采取强制类型转化,然后我们这里是延伸到40个字节的空间//因为我们知道,开辟空间的时候可能会导致内存空间的扩展失败//所以我们不能直接p=realloc(int*)realloc(p, 10 * sizeof(int)); //而是进行先搞一个新的指针变量,确定成功了,再进行赋值//也就是int* ptr = (int*)realloc(p, 10 * sizeof(int));if (ptr == NULL){perror("realloc:");//打印错误信息如果是空指针return 1;}p = ptr;for (int i = 0; i < 10; i++){*(p + i) = 0;printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}

这里是15个0 

因为calloc也打印5个0 

不要误解

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

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

相关文章

前端三剑客 —— CSS (上)

上节内容中提到了 前端三剑客 —— HTML 超文本标记语言&#xff0c;这节内容 跟大家讲述三剑客中的第二个 CSS。 CSS 什么是CSS Cascading Style Sheel&#xff0c;简称CSS&#xff0c;中文叫层叠样式表&#xff0c;也叫级联样式表。主要作用是来修饰HTML页面的一种技术。 …

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型&#xff0c;该模型言简意赅&#xff0c;但是但从论文理解&#xff0c;有很多细节都不清楚&#xff0c;尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关&#xff0c;本文将根据代码详…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读&#xff08;非常推荐&#xff09; Generating Mammography Reports from Multi-view Mammograms with BERT&#xff08;上&#xff09; 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

基于单片机的数字万用表设计

**单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…

【性能测试】接口测试各知识第2篇:学习目标,1. 理解接口的概念【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

ChatGPT 的行家指南

原文&#xff1a;An Insider’s Guide to using ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 你是否厌倦了花费无数小时为你的业务创建内容&#xff1f;从博客文章到社交媒体更新&#xff0c;从电子书内容到电子邮件&#xff0c;这可能是一个耗时的过…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

基于java+SpringBoot+Vue的学生心理咨询评估系统设计与实现

基于javaSpringBootVue的学生心理咨询评估系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 后台展示 用户管理模块&#xff1a;管理员可以查看、添加、编辑和删除用户信息。 试题管理模块&#xff1a…

Qt + VS2017 创建一个简单的图片加载应用程序

简介&#xff1a; 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片&#xff0c;并保存用户上次选择的图片路径。 1. 创建项目&#xff1a; 首先&#xff0c;在VS中创建一个新的Qt Widgets应用程序项目&#xff0c;并…

LeetCode 1379.找出克隆二叉树中的相同节点:二叉树遍历

【LetMeFly】1379.找出克隆二叉树中的相同节点&#xff1a;二叉树遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0…

Golang | Leetcode Golang题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; func lengthOfLongestSubstring(s string) int {// 哈希集合&#xff0c;记录每个字符是否出现过m : map[byte]int{}n : len(s)// 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左侧&#xff0c;还没有开始移动r…

CMD 命令行进入到电脑硬盘的某个目录的几种方式

本文介绍几种 cmd 命令行进入到电脑硬盘的某个目录的几种方式。 1、在具体文件目录地址栏输入 cmd 回车 这是最快的、最牛的方式&#xff0c;没有之一。 比如&#xff1a;我想进入一个层级很深的文件目录&#xff0c;直接打开在那个目录&#xff0c;把地址栏信息删除清空&am…

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

【C++进阶】带你手撕红黑树(红与黑的爱恨厮杀)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 引言&#xff1a; 之前我们…

vivado 串行矢量格式 (SVF) 文件编程

串行矢量格式 (SVF) 文件编程 注释 &#xff1a; 串行矢量格式 (SVF) 编程在 Versal ™ 器件上不受支持。 对 FPGA 和配置存储器器件进行编程的另一种方法是通过使用串行矢量格式 (SVF) 文件来执行编程。通过 Vivado Design Suite 和 Vivado Lab Edition 生成的 SVF …

八数码(bfs做法)非常详细,适合新手服用

题目描述&#xff1a; 在一个 33 的网格中&#xff0c;1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&#xff09;。 我…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件

Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件&#xff0c;同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载&#xff1a;Folder Icons for Mac v1.8 激活版 以下是这款软件的一…