概述
realloc函数
语法
原型:extern void *realloc(void mem_address, unsigned int newsize);
指针名=(数据类型)realloc(要改变内存大小的指针名,新的大小)。
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
如果堆空间不足,函数调用失败,那么可能会造成数据丢失和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);
对于这个程序来说,系统应该做到的是检测两个函数操作的空间长度是否相等,如果相等那么,realloc函数应该不作为,返回原来的指针。
那么函数是如何知道他们的长度是相同的呢?
首先如果调用另一个函数来计算两个内存空间的长度,这样做是很笨的,微软的程序员子安也不会这么操作,这时候就体现出了头部信息的作用了,通过头部信息就可以直接的知道,malloc和realloc操作的空间长度
另外在此附上一个顺序表的增容函数有realloc所写
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;
}
最后
以上就是迅速雪碧为你收集整理的realloc函数最详细解释的全部内容,希望文章能够帮你解决realloc函数最详细解释所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复