当我尝试使用realloc
为已被分配的指针分配内存时,free
出现分段错误。虽然如果我使用它,我不会遇到这个问题malloc
。
根据我对变量的理解,free
它相当于一个NULL
指针,那么为什么会出现这种意外行为呢?我错过了什么吗?
当我尝试使用realloc
为已被分配的指针分配内存时,free
出现分段错误。虽然如果我使用它,我不会遇到这个问题malloc
。
根据我对变量的理解,free
它相当于一个NULL
指针,那么为什么会出现这种意外行为呢?我错过了什么吗?
根据我的理解,在变量被释放后它相当于一个 NULL 指针。
指针是一个NULL
指针,其值为NULL
; 像realloc
知道如何解释这个值的标准函数。
指向已释放内存的指针现在是无效指针;它的价值不会改变。 realloc
不知道它是无效的,并会尝试访问它,从而导致 seg-fault。
已被free
'd的指针不等同于NULL
指针。调用后,free
您需要将指针设置为NULL
自己。
如果您传递一个指向realloc
已free
'd 但未明确设置为的指针NULL
,则您可能传递realloc
了一个无效地址,它将尝试使用该地址,从而导致未定义的行为,从而导致您的段错误。
否free()
不将指针设置为0,您必须自己做。
如果传递给 realloc 的指针为空,它将为您分配它。
不,free
'd 指针不等同于空指针。 free
不修改传入的指针,所以指针继续指向同一个内存位置,现在是未分配的内存。
如果您尝试这样realloc
做,那么内存分配器将变得混乱并破坏其内部结构,这就是您得到段错误的原因。
这个来自 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)。
您传入的指针realloc
必须是以下两种情况之一:先前从malloc
/ calloc
/返回的有效指针realloc
,或者空指针。
如果释放内存,则需要将指针设置为 NULL,然后再将其传递给它realloc
。free
不会将指针设置为 NULL(也不会以任何其他方式修改指针本身——它不能因为它接收指针的副本,而不是指针本身)。