c-已释放的指针的realloc内存



当我尝试使用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,然后再将其传递给reallocfree不会将指针设置为NULL(也不会以任何其他方式修改指针本身——它不能,因为它接收的是指针的副本,而不是指针本身)。

相关内容

  • 没有找到相关文章

最新更新