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)
上一篇 2026年2月26日 下午2:01
下一篇 2026年2月26日 下午2:22


相关推荐

发表回复

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

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