0

当我尝试使用realloc为已被分配的指针分配内存时,free出现分段错误。虽然如果我使用它,我不会遇到这个问题malloc

根据我对变量的理解,free它相当于一个NULL指针,那么为什么会出现这种意外行为呢?我错过了什么吗?

4

6 回答 6

4

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

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

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

于 2012-07-12T15:34:41.753 回答
3

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

如果您传递一个指向reallocfree'd 但未明确设置为的指针NULL,则您可能传递realloc了一个无效地址,它将尝试使用该地址,从而导致未定义的行为,从而导致您的段错误。

于 2012-07-12T15:33:20.910 回答
3

free()不将指针设置为0,您必须自己做。

如果传递给 realloc 的指针为空,它将为您分配它。

于 2012-07-12T15:33:56.277 回答
0

不,free'd 指针不等同于空指针。 free不修改传入的指针,所以指针继续指向同一个内存位置,现在是未分配的内存。

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

于 2012-07-12T15:33:50.363 回答
0

这个来自 Debian Linux 机器的 man realloc(3) 应该告诉你所有你需要知道的 - 在使用 realloc() 之前基本上不要释放

realloc() 将 ptr 指向的内存块的大小更改为 size 字节。内容将不变为新旧尺寸中的最小值;新分配的内存将未初始化。如果 ptr 为 NULL,则对于所有 size 值,调用等效于 malloc(size);如果 size 等于 0,并且 ptr 不为 NULL,则调用等效于 free(ptr)。除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。如果指向的区域被移动,则执行 free(ptr)。

于 2012-07-12T15:35:16.120 回答
0

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

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

于 2012-07-12T15:36:33.393 回答