realloc函数最详细解释

realloc函数最详细解释realloc 函数语法原型 externvoid realloc voidmem address unsignedintn 指针名 数据类型 realloc 要改变内存大小的指针名 新的大小 新的大小可大可小 如果新的大小大于原内存大小 则新分配部分不会被初始化 如果新的大小小于原内存大小 可能会导致数据丢失 1 2 头文件 include amp amp amp amp amp amp amp lt

realloc函数

语法
原型:extern void *realloc(void mem_address, unsigned int newsize);
指针名=(数据类型
)realloc(要改变内存大小的指针名,新的大小)。

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

void main()//想要为开辟的内存空间复制 { 
    int *ip = (int *)malloc(sizeof(int) * 5); int *p = ip;//这是第二种方式,操作第二个指针,这样就不会改变指针ip的位置 //for (int i = 0; i < 5; i++){ ip[i] = i; }//这是第一种方式,采用下标法 /*for (int i = 0; i < 5; i++) { *ip = i; ip++; //这是不对的,如果在malloc的开辟内存空间中移动了指针会导致free时出现错误 }*/ for (int i = 0; i < 5; i++) { 
    *p = i; ++p; } //如果内存分配的空间大小不足,5个不够要开辟100个怎么办? //int *ip = (int *)realloc(ip,sizeof(int) * 100); //(int *)realloc(ip, sizeof(int) * 100);这种情况当原本ip的空间后面存在95个连续的未用空间,那么这种操作时正确的 //但是如果,原本的空间不够,那么在开辟新的100的内存空间时会自动释放原本的空间,那么ip就被释放了 ip = (int *)realloc(ip, sizeof(int) * 2);//就开辟8个字节内存,会造成数据丢失 ip = (int *)realloc(ip, sizeof(int) * 0);//相当于将ip指针释放并返回空指针相当于free函数 ip = (int *)realloc(NULL, sizeof(int) * 10);//如果调用内存监视,可以看见fd fd fd fd由上下越界标记可以看到所占用的内存 //如果realloc的操作对象的原指针是NULL 指针,会产生40个字节的空间,但是空间的数为随机值 ip = (int *)realloc(NULL, sizeof(int) * 0); //mallic(0) //两个NULL不是同一个指针,所以在执行realloc时操作的不是用一个内存空间,所以ip = (int *)realloc(NULL, sizeof(int) * 0);时相当于malloc(0) //但是其返回值不是NULL是因为在内寸中不止有数据,还有一些头信息 } 

在这里插入图片描述
上图中两行fd是界限标识,两行fd之间就是在内存中开辟的位置
如果用realloc将ip的范围缩小在内存中的表现为
在这里插入图片描述
所以当realoc的开辟空间大小小于原来的空间是就会造成数据丢失
如果realloc的操作指针为NULL
就会产生40个字节的空间返回值不为NULL
在这里插入图片描述
该图其中的cd表示堆空间的随机覆盖值
但是ip = (int )realloc(NULL, sizeof(int) * 0); //mallic(0)
两个NULL不是同一个指针,所以在执行realloc时操作的不是用一个内存空间,所以ip = (int )realloc(NULL, sizeof(int) * 0);时相当于malloc(0)
但是其返回值不是NULL是因为在内寸中不止有数据,还有一些头信息


我再次举一个关于头部信息的例子









int *p=(int *)malloc(10); p=(int *)realloc(10); 
bool inc_size(Seqlist&x)//增容函数 { 
    elemtype *temp=x.data;//用于保护原来的数据 temp = (elemtype*)realloc(x.data,sizeof(elemtype)*(x.maxsize)*LIST_INC_SIZE);//如果失败,temp为空但是x.data不受影响 if (temp == NULL)// 如果成功realloc会把原来的指针free在返回给temp { 
    return false; } x.data = temp; x.maxsize = LIST_INC_SIZE*x.maxsize; return true; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230387.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis返回结果类型(resulttype返回list)

    1.返回List>12selectid=”getMyCredit”parameterClass=”java.util.Map”resultClass=”java.util.HashMap”>select>这样设置返回类型为resultClass=”java.util.Ha

    2022年4月18日
    105
  • Mysql数据库外键的使用【重点】

    Mysql数据库外键的使用【重点】Mysql 数据库外键用法

    2025年6月29日
    2
  • java面试两年工作经验的_无经验应届生面试自我介绍

    java面试两年工作经验的_无经验应届生面试自我介绍动机:最近换了个公司,从三月底开始面,面到四月底,面了有快二十家公司。我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或者哪些问题是自己之前没遇到过的,或者是哪个知识点今天又问了等等。四月中旬的时候,我就在构思要写一篇面经,主要是想着可能对那些跟我相同处境的人有点帮助,再者就是稍微记录下这为期一个月的面试过程。本文地址:http://blog….

    2022年8月10日
    9
  • MySQL查看用户权限及权限管理

    MySQL查看用户权限及权限管理一、MySQL权限级别介绍全局——可以管理整个MySQL库——可以管理指定的数据库表——可以管理指定数据库的指定表字段——可以管理指定数据库的指定表的指定字段权限存储在mysql库的user,db,tables_priv,columns_priv,procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中二、查看用户权限1、查看所有用户(用户名、给谁授权)…

    2022年6月18日
    72
  • 强化学习(Q-Learning,Sarsa)

    强化学习(Q-Learning,Sarsa)ReinforcementLearning监督学习–>非监督学习–>强化学习。监督学习:拥有“标签”可监督算法不断调整模型,得到输入与输出的映射函数。非监督学习:无“标签”,通过分析数据本身进行建模,发掘底层信息和隐藏结构。但是1.标签需要花大量的代价进行收集,在有些情况如子任务的组合数特别巨大寻找监督项是不切实际的。2.如何更好的理解数据,学习到具体的映射而不仅仅是数据的底…

    2022年10月3日
    4
  • linux route add 接口,route add命令如何使用「建议收藏」

    linux route add 接口,route add命令如何使用「建议收藏」routeadd命令用于在本地IP路由表中显示和修改条目,使用不带参数的ROUTE可以显示帮助,代码为【route[-f][-p][command[destination][masknetmask]….】。routeadd命令使用情况:一、具体功能该命令用于在本地IP路由表中显示和修改条目。使用不带参数的ROUTE可以显示帮助。二、语法详解route[-f][-p][c…

    2022年8月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号