C语言realloc的用法
realloc是指在原先的那块内存上在其后方添加了5个内存空间,还是重新又找了块空间一下分配出来?oldbase = newbase这一步需不需要?如果说是在原来那块内存上接着分配增加的空间,那恰好这连续的空间正好正被使用,那realloc函数岂不是极其容易分配失败?而如果又重新找了一块空间一下分配,那之前使用的的那部分内存岂不是泄露了? 展开
void *realloc(void *p,size_t size)
realloc函数将p指向的对象的长度修改为size个字节,如果新分配的内存比原来的大,则原来的数据保持不变,增加的空间不进行初始化。
如果新分配的内存比原来的内存小,则新的内存空间不被初始化,realloc函数返回指向新分配空间的指针,若无法满足要求则返回NULL 指针,在这种情况下,原指针p指向的单元内容保持不变。
扩展资料:
使用总结
1、ealloc失败的时候,返回NULL
2、realloc失败的时候,原来的内存不改变,不会释放也不会移动
3、假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址。
假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址。
参考资料来源:百度百科-realloc
原型:extern void *realloc(void *ptr, size_t newsize);
用法:#include <stdlib.h>
功能:改变ptr所指内存区域的大小为newsize长度。
说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
示例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *p;
p = (char *)malloc(100);
if(p)
printf("Memory Allocated at:%p\n", p);
else
printf("Not Enough Memory!\n");
p = (char *)realloc(p, 256);
if(p)
printf("Memory Reallocated at:%p\n", p);
else
printf("Not Enough Memory!\n");
free(p);
return 0;
}
延伸:通常,realloc的用法会如下:
p = realloc(p, new_size);
if (p == NULL) {
return;
}
如果realloc()失败,ptr指向的这块内存不会变化,不会free或者移动。也就是说,如果realloc()失败了,照着上面代码的写法,这块内存就被永远遗忘。
tmp = realloc(p, new_size);
if (tmp == NULL) {
free(p);
return;
}
p = tmp;
至于oldbase = newbase是不必须的,就是也可以把两步合成一步:
oldbase = (int*)realloc(oldbase,(old_length+5)*sizeof(int))
newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!说明:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。