realloc内存为已释放的指针?

时间:2012-07-12 15:32:01

标签: c pointers memory-management malloc

当我尝试使用realloc为已经free'的指针分配内存时,我遇到了分段错误。虽然如果我使用malloc而不会遇到此问题。

根据我的理解,在变量为free之后,它等同于NULL指针,那为什么会出现这种意外行为呢?我错过了什么吗?

6 个答案:

答案 0 :(得分:3)

已经free'd的指针等同于NULL指针。调用free后,您需要自己设置指针NULL

如果您将realloc的指针传递给free,但明确设置为NULL,那么您可能正在通过realloc一个无效的地址,它将尝试使用,导致未定义的行为,因此您的段错误。

答案 1 :(得分:3)

没有free()没有将指针设置为0,你必须自己做。

如果传递给realloc的指针为null,它将为你malloc它。

答案 2 :(得分:3)

  

根据我的理解,在变量被释放后,它相当于一个NULL指针。

NULL指针是一个值为NULL的指针;像realloc这样的标准函数知道如何解释这个值。

指向已释放的某些内存的指针现在是无效指针;它的价值不会改变。 realloc不知道它无效,并会尝试访问它,导致seg-fault。

答案 3 :(得分:0)

不,free'd指针不等于空指针。 free不会修改传入的指针,因此指针继续指向相同的内存位置,现在是未分配的内存。

如果您尝试realloc,那么内存分配器将会混淆并破坏其内部结构,这就是您遇到段错误的原因。

答案 4 :(得分:0)

这来自Debian Linux盒子里的man realloc(3)应该告诉你所有你需要知道的事情 - 在使用realloc之前基本上没有自由()

  

realloc()将ptr指向的内存块的大小更改为   大小字节。内容将保持不变   新旧尺寸;新分配的内存将是未初始化的。如果   ptr为NULL,然后调用等效于malloc(size)   大小值;如果size等于零,那么ptr不为NULL   该调用相当于free(ptr)。除非ptr为NULL,否则它必须   早先调用malloc(),calloc()或   realloc的()。如果指向的区域被移动,则完成免费(ptr)。

答案 5 :(得分:0)

传入realloc的指针必须是以下两种情况之一:先前从malloc / calloc / realloc返回的有效指针,或者是空指针。

如果释放内存,则需要将指针设置为NULL,然后再将其传递给reallocfree不会将指针设置为NULL(也不能以任何其他方式修改指针本身 - 它不能,因为它接收指针的副本,而不是指针本身)。