realloc也可以缩容了??

news2024/12/24 18:10:20

作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

realloc的细节

  • 前言
  • 一、realloc的原地扩容和异地扩容
  • 二、关于realloc是否可以缩容问题


前言

学习这篇文章之前,最好需要看一下我写的动态内存管理那篇文章link,因为是建立在realloc的基础上再加深对realloc的理解,让我们一起来探索realloc真正的含义


一、realloc的原地扩容和异地扩容

我们知道realloc是对已经动态开辟好的内存空间进行扩容,我们是在原来的基础上扩容呢??还是重新开辟一块空间,再动态内存管理那篇博客,我只带大家画图去理解了一下,这次我将深入内存带大家理解,看看realloc再内存中到底干了什么

例子:

int main()
{
	int* a = (int*)malloc(sizeof(int) * 10);//向空间申请10个整型的空间大小(40个字节)
	int *tmp = (int*)realloc(a, sizeof(int)*20);//扩容到20个整型
	return 0;
}

在这里插入图片描述

我们看到这两个地址是一样,说明realloc是原地扩容,原因是原来地址的后面空间足够realloc继续往后面扩展,如果我们扩容的空间较大呢??

int main()
{
	int* a = (int*)malloc(sizeof(int) * 10);//向空间申请10个整型的空间大小(40个字节)
	int *tmp = (int*)realloc(a, sizeof(int)*2000);//扩容到2000个整型
	return 0;
}

在这里插入图片描述

我们看到这是异地扩容,是两块不同的空间地址,所以我们再进行扩容的时候,都是先使用一个变量保存,然后再赋值给原变量,这样防止数据丢失

如果对已经开辟的空间后面进行查看会出现怎样的情况,以及修改里面的数据会出现什么情况??
在这里插入图片描述
看到这这幅图应该就明白了malloc出来的空间,我们既可以操作也可以查看,后面的空间我们不能操作但是可以访问

二、关于realloc是否可以缩容问题

对于扩容,我的解释是增加空间大小,可以存放更多的数据,对于缩容,表示的是把空间大小减小,变成我们所需要的空间大小,缩容不存在异地缩容,接下来我会定义另一个变量为了区分

我们来看一下这个代码:

int main()
{
	int* a = (int*)malloc(40);//向空间申请10个整型的空间大小(40个字节)
	for (int i = 0; i < 10; i++)
	{
		a[i] = i;
	}
	int *tmp = (int*)realloc(a,20);//缩成5个整型的大小
	for (int i = 0; i < 5; i++)
	{
		tmp[i] = i;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", tmp[i]);
	} 
	return 0;
}

运行结果:
在这里插入图片描述
看到这里我相信有部分人会像,这不是可以缩容了吗?有句话叫眼见不一定为真,我们深入内存来看看
在这里插入图片描述
我们看到这个图大致可以明白,出现断点的原因就是出现的野指针的非法访问

我们对tmp进行操作的时候出现了非法访问,很简单,我们缩容了空间变小了,你在往后面访问肯定会出现错误的,那么就是说访问的时候也是会出现非法访问,事实真的是这样吗?我们将tmp后面的数据访问看看会不会报错
在这里插入图片描述

我们上面介绍了不属于我们空间的时候,查看就会出现乱码

在这里我想说起始后面的那块空间实际上只是使用权限不属于我们了,归还给操作系统了,和free不一样,他是把空间都还给操作系统了但是空间还是属于我们的,因为不能操作,所以不能很好给大家看效果,我只能用文字的形式给大家说明

按照我上面的方法确实可以取巧类似于缩容,但是不推荐, 万一你的realloc别人没看到,对后面的数据进行修改出现错误呢?别人默认realloc只做扩容的任务,你突然来个缩容,难免会弄成消化。

我们缩的仅仅只是使用权限,空间还是没有减少的,希望大家可以更好的理解一下

那我们今天的只是分享就先到这里结束了,期待我的下一篇和大家见面

在这里插入图片描述

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

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

相关文章

快速搭建本地服务器

一、anywhere 1、npm install anywhere -g 2、打开位于文件夹下的终端页&#xff0c;输入anywhere 9999 9999这里是设置端口号&#xff0c;端口号自行设置&#xff0c;也可以不输入xxx会默认8080端口号 二、http-server 1、npm install http-server -g 2、打开位于文件夹下…

[golang]Go语言从入门到实践-反射

反射三定律&#xff1a; 1.变量---->反射变量 2.变量---->反射变量---->接口 3.变量----->(通过取地址&)反射变量---->修改变量的值 反射的类型和种类&#xff1a; 切片、集合、结构体、指针、函数与反射...... 总结&#xff1a; 内置包函数 reflect 的…

darknet测试yolo

原文链接&#xff1a;https://wangguo.site/posts/38432.html YOLO: Real-Time Object Detection 1、下载yolo权重文件 mkdir model #新建文件夹放权重文件 cd model wget https://pjreddie.com/media/files/yolov3.weights2、测试图片 执行命令 ./darknet detect cfg/yolo…

(socket编程实验中遇到的问题)connect error no route to host

在编写网络编程的时候遇到了这个问题connect error no route to host socket编程&#xff08;服务端与客户端&#xff09; 上网一搜全是&#xff1a; 两台机器进行socket通信时&#xff0c;可能在连接时出现错误&#xff1a; connect error: No route to host(errno:113) 出…

产品新人如何培养产品思维?

什么是产品思维&#xff1f;其实很难定义&#xff0c;不同人有不同的定义。有的人定义为以用户为中心打磨一个完美体验的产品&#xff1b;有的定义为从需求调研到需求上线各个步骤需要思考的点&#xff0c;等等。本文想讨论的产品思维是&#xff1a;怎么去发现问题&#xff0c;…

23.3.6打卡 AtCoder Beginner Contest 277 A~D

E题最短路有点生疏了先不写, 之后再补 A 题意 给出一个排列和X 问X在排列中出现的下标是多少 代码 void solve() {cin>>n>>m;for(ll i1;i<n;i) {cin>>arr[i];if(arr[i]m) ansi;}cout<<ans<<endl;return; }B题 题意 这机翻翻译的挺正确的…

5.3中断系统中的设备树——中断号的演变与irq_domain

通过上一节我们知道&#xff0c;在内核中有一个irq_desc数组&#xff0c;数组里面的每一项对应一个中断&#xff0c;数组的下标就是对应中断的虚拟中断号&#xff08;virq&#xff09;。 假设只有一个中断控制器&#xff0c;有32个中断&#xff0c;那么中断和irq_desc数组可以…

654. 最大二叉树

题目 leetcode题目地址 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返…

项目黑马面面-学科列表-增删改查

查 1.布局2.定义api3.导入api4.进入页面就调用api5.获取数据6.存储并渲染7.与分页建立关联a.请求参数值要与分页组件绑定b.total值存储并绑定到分页组件c.页码改变与页容量改变都要请求api1.布局 <template><div><el-card><el-form :inline"true&q…

C语言例程:猜数字游戏

猜数字游戏 实现一个简单的猜数字游戏&#xff0c;学习 while 循环语句的用法。 实例解析 while 循环语句 while 语句的一般形式为&#xff1a; while(表达式)语句; 其中表达式是循环条件&#xff0c;语句为循环体。 while 语句的语义是&#xff1a;计算表达式的值&#xf…

Vue使用ElemenUI对table的指定列进行合算

前言 最近有一个想法&#xff0c;就是记录自己花销的时候&#xff0c;table中有一项内容是花销的金额。然后想在table的底部有一项内容是该金额的总计。 然后我就顺着elemetui的table组件寻找相关的demo&#xff0c;还真发现了一个这样的demo。 对于这个demo&#xff0c;官方…

嵌入式 Linux进程之间的通信

目录 1、Linux进程间的通信继承 2、Linux进程之间的通信种类 3、管道 3.1 管道概述 3.2 管道文件 3.3 管道特点 3.4 通信框架 3.5 对管道文件进行操作 4、标准流管道 5、无名管道 PIPE 5.1 无名管道特点 5.2 创建管道函数 6、有名管道&#xff08;FIFO&#x…

FPGA lattice 深力科LCMXO3LF-2100C-5BG324I拥有很强的灵活性和适应性可编程内核的FPGA 值得期待

FPGA lattice 深力科LCMXO3LF-2100C-5BG324I MachXO3系列 拥有很强的灵活性和适应性可编程内核的FPGA 值得期待 &#xff0c;FPGA 现场可编程逻辑器件,小尺寸&#xff0c;高性能&#xff01;在工业领域&#xff0c;它可以用于网络控制器&#xff0c;PLC,网络边缘计算&#xff0…

kubernetes--分析容器系统调用:Sysdig

目录 Sysdig介绍&#xff1a; sysdig工作流程 安装Sysdig sysdig常用参数&#xff1a; sysdig过滤&#xff1a; sysdig之Chisels&#xff08;工具箱&#xff09;&#xff1a; 其他常用命令 Sysdig介绍&#xff1a; Sysdig是一个非常强大的系统监控分析和故障排查工具。汇…

MOEA/D: A Multiobjective Evolutionary Algorithm Based on Decomposition

目录1 问题定义2 算法步骤3 代码4 效果1 问题定义 本博客以最小化问题为例 f1x2f2(x−2)2min⁡f(f1(x),f2(x))\begin{aligned} f_1 & x ^2 \\ f_2 & (x - 2) ^2 \\ \min f & (f_1(x), f_2(x)) \end{aligned} f1​f2​minf​x2(x−2)2(f1​(x),f2​(x))​ 代码…

二十、常用调优工具概述与Jprofiler演示

常用调优工具 1.JDK命令行 2.Eclipse:Memory Analyzer Tool 3.Jconsole 4.VisualVM 5.Jprofiler 6.Java Flight Recorder 7.GCViewer 8.GC Easy jprofiler 简介&#xff1a; 他把CPU、执行引擎和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合…

集成学习boosting、bagging、stacking

目录 一、介绍 二、三种架构学习 &#xff08;1&#xff09;boosting &#xff08;2&#xff09;bagging &#xff08;3&#xff09;stacking 一、介绍&#xff1a; 对于单个模型来说很难拟合复杂的数&#xff0c;模型的抗干扰能力较低&#xff0c;所以我们希望可以集成多…

ElasticSearch 8 学习笔记总结(五)

文章目录一、ElasticSearch 8 版本二、ES8 集群 环境安装1. 生成安全证书2. 生成http证书3. 配置第一个节点4. 配置其他节点三、ES集群 关联问题解决四、 Kibana 安装和使用五、kibana 基础操作1. 索引操作2. 文档操作3. 文档搜索4. 索引模板六、分词器七、文档评分机制1. 什么…

上拉电阻与下拉电阻总结

文章目录相关概念介绍IO引脚的三态输出之高阻态---将逻辑门与系统其他部分隔离&#xff0c;电平外部控制IO引脚输出模型 推挽电路 与 开漏电路---单独开漏无高电平驱动能力原理介绍什么是上下拉电阻&#xff1f;---把IO口用电阻拉到正压VCC&#xff08;上拉&#xff09; 或 接地…

如何使用Docker容器部署O2OA(翱途)开发平台与OnlyOffice的集成版本?

O2OA(翱途)开发平台[下称O2OA平台或者O2OA]默认可以和OnlyOffice进行集成来实现在线文档编辑以及流程集成。开发者可以直接安装O2OA官网的OnlyOfficeO2Server的Docker版本用于体验。本文将详细介绍如何安装O2OA OnlyOffice的Docker版本。OnlyOffice Docs Sever可以单独安装,O2…