当我尝试使用realloc
为已经free
'的指针分配内存时,我遇到了分段错误。虽然如果我使用malloc
而不会遇到此问题。
根据我的理解,在变量为free
之后,它等同于NULL
指针,那为什么会出现这种意外行为呢?我错过了什么吗?
答案 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,然后再将其传递给realloc
。 free
不会将指针设置为NULL(也不能以任何其他方式修改指针本身 - 它不能,因为它接收指针的副本,而不是指针本身)。