当我尝试使用realloc
为已为free
'd的指针分配内存时,我会遇到分段错误。尽管如果我使用malloc
,我不会面临这个问题。
根据我的理解,在变量被free
’d之后,它相当于NULL
指针,那么为什么会出现这种意外行为呢?我是不是错过了什么?
根据我的理解,在变量被释放后,它相当于一个NULL指针。
NULL
指针是其值为NULL
的指针;像realloc
这样的标准函数知道如何解释这个值。
指向某个已释放内存的指针现在是无效指针;它的价值不会改变。realloc
不知道它是无效的,并将尝试访问它,从而导致seg故障。
没有free()
不将指针设置为0,您必须自己设置。
如果传递给realloc的指针为null,它将为您分配malloc。
已被free
'd的指针不等同于NULL
指针。调用free
之后,您需要自己将指针设置为NULL
。
如果您传递的指向realloc
的指针是free
'd,但没有显式设置为NULL
,那么您可能传递的realloc
是一个无效地址,它将尝试使用该地址,从而导致未定义的行为,从而导致segfault。
否,free
'd指针不等同于空指针。free
不修改传入的指针,因此指针继续指向相同的内存位置,该位置现在是未分配的内存。
如果您尝试realloc
,那么内存分配器将被混淆并损坏其内部结构,这就是为什么您会得到segfault。
这个来自man realloc(3)的Debian Linux盒子应该告诉你所有你需要知道的-基本上在使用realloc之前不要释放
realloc()将ptr指向的内存块的大小更改为大小字节。内容将保持不变,为新旧尺寸;新分配的内存将被取消初始化。如果ptr为NULL,则该调用等效于malloc(大小),对于所有大小值;如果大小等于零,并且ptr不为NULL,则该调用相当于free(ptr)。除非ptr为NULL,否则它必须已由先前对malloc()、calloc()或realloc()。如果所指向的区域被移动,则完成空闲(ptr)。
传递到realloc
的指针必须是以下两项之一:要么是以前从malloc
/calloc
/realloc
返回的有效指针,要么是空指针。
如果释放内存,则需要将指针设置为NULL,然后再将其传递给realloc
。free
不会将指针设置为NULL(也不会以任何其他方式修改指针本身——它不能,因为它接收的是指针的副本,而不是指针本身)。