【发布时间】:2017-12-25 16:01:41
【问题描述】:
realloc 可以返回相同的输入地址或不同的地址。如果它返回一个不同的地址,那么它将在内部取消分配/释放输入内存并将该内容移动到另一个位置并返回该新地址。
请考虑以下情况。
new_ptr = realloc (2000, 10000) // Lets assume the input address is 2000
// Lets assume the new_ptr address is 3000
因此,realloc 内部应释放指针指向 2000 的内存并将这些数据移动到新位置 3000 并返回 3000 地址。
现在地址 2000 指向无效。因此,realloc API 不会将它分配给 NULL。
现在,将无效地址传递给 realloc 函数。实时可能会有变化,realloc 可能会得到无效的输入地址。
new_ptr = realloc(2000, 10000)
此 2000 地址无效,因为它已被先前的 realloc 释放。现在程序崩溃了。
我可以通过以下方式解决此问题吗?
if (new_ptr != old_ptr ) {
old_ptr = NULL;
}
由于 old_ptr 无效。我将把它分配给NULL。 请确认我的更正。
【问题讨论】:
-
我认为这是一个XY problem,因为 OP 似乎没有向我们展示真正的问题。
-
总是使用返回值,不一样没关系。使用临时指针检查
NULL,这是唯一需要旧指针的情况。 -
问题是
realloc成功后该区域被释放,并分配一个新的,旧指针会有不确定的值,所以你不能比较new_ptr != old_ptr。 -
使用已释放的指针值调用
realloc()会导致未定义的行为。现在对 2000 指针的任何使用都无效。当您使用它时,任何事情都可能发生。该程序没有义务崩溃。它没有义务不崩溃。 -
没有可移植的方法来知道块是否移动,并且测试旧指针是未定义的行为
标签: c memory-management realloc