概述:
void *realloc(void *ptr, size_t size)realloc实在原有内存基础上直接从队上再分配指定数量的内存块,如果分配成功,返回新的地址,这样隐含源地址失效的风险。
例如:
char *p,*q;
p = malloc(sizeof(char)*1024);
q = p;
p = realloc(p,1024);//可能造成q指针失效,因为p在这过程中已经释放了。
源码如下:
void *realloc(void *ptr, size_t size)
{
memblock_t *m;
void *new = NULL;
if (ptr) {
if (!(m = memblock_get(ptr))) {
printk(KERN_ERR "bug: realloc non-exist memory\n");
return NULL;
}
if (size == m->size)
return ptr;
if (size != 0) {
if (!(new = kmalloc(size, GFP_KERNEL)))
return NULL;
memmove(new, ptr, m->size);//数据拷贝
if (memblock_add(new, size)) {
kfree(new);
return NULL;
}
}
memblock_del(m);
kfree(ptr);//造成风险
} else {
if (size != 0) {
if (!(new = kmalloc(size, GFP_KERNEL)))
return NULL;
if (memblock_add(new, size)) {
kfree(new);
return NULL;
}
}
}
return new;
}
本文深入探讨了C语言中realloc函数的使用风险,通过具体实例展示了realloc函数如何在原有内存基础上重新分配内存块,并分析了可能导致源指针失效的原因。文章详细解释了realloc函数的源代码实现,帮助开发者理解其内部工作原理。
1668





