realloc函数最详细解释

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40738945/article/details/85330548