将 realloc() 返回的地址分配给同一个指针是好的编码习惯吗?

Is it good coding practice to assign the address returned by realloc() to the same pointer?

我在一些网站上看到了一些与 realloc() 相关的代码,如下所示。

int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);

但是正如标准所说,如果 realloc 失败,原始块将保持不变并且它 returns NULL。

所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。任何人都可以让我知道将 realloc() 返回的地址分配给同一个指针是好的编码习惯吗?

您是正确的,直接将 realloc 的 return 值分配给原始指针的唯一副本是一种不好的做法。如果 realloc 失败,您不仅会失去 free 记忆的能力(我认为这是次要问题);您还丢失了指针指向的数据

对于某些程序,这可能无关紧要(例如,如果您只是要终止并中止分配失败的整个操作,这可能是也可能不是可接受的做法,这本身就是一个完整的主题)但是一般来说,你需要先将realloc的结果存储到一个单独的临时变量中,只有在检查成功后才覆盖原来的指针变量。

R。明确回答了你的问题。让我强调代码片段中的另外两个问题:

int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);

在 C 语言中,强制转换 malloc()calloc()realloc() 的 return 值通常被认为是不好的做法。 void * return 值将自动转换为适当的指针类型,除非代码被编译为 C++ 代码,它是 C 的远亲。

更重要的是,realloc 指向硬编码大小 100 的指针没有意义。在重新分配的数组中可访问的 int 的数量将取决于 int 类型的实际大小,这可能因系统而异。事实上,在某些架构上,100 甚至不是 sizeof(int) 的倍数。作者可能打算写 p = realloc(p, sizeof(int) * 100);p = realloc(p, sizeof(*p) * 100);,片段周围的更多上下文可能有助于理解其意图...正如所写的那样,由于多种原因,它很可能是一个错误。