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
