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

Posted

技术标签:

【中文标题】将 realloc() 返回的地址分配给同一个指针是一种好的编码习惯吗?【英文标题】:Is it good coding practice to assign the address returned by realloc() to the same pointer? 【发布时间】:2016-11-07 20:42:15 【问题描述】:

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

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

但正如标准所说,如果 realloc 失败,原始块保持不变并返回 NULL。

所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。谁能告诉我

【问题讨论】:

Unrealed,只要您关注的是“良好的编码习惯”,也许可以阅读:Do I cast the result of malloc?。 谁能告诉我 就在 所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。?你怎么看? 谁投票结束,这“主要基于意见”是如何产生的? OP 询问的做法总是一个错误 @AndrewHenle :我认为直接分配是不对的。但我想确认一下。 @WhozCraig:感谢您的链接。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

谢谢。我只是复制了互联网站点上显示的示例之一。但我明白这一点。

以上是关于将 realloc() 返回的地址分配给同一个指针是一种好的编码习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

堆的分配和释放(malloc,free,calloc,realloc)

realloc 会覆盖旧内容吗?

在不移动数据的情况下在 CUDA 中实现 realloc

Realloc 没有调整指针数组的大小

`realloc` 如何在后台实际工作?

动态分配内存-realloc