将 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 ofmalloc
?。
谁能告诉我 就在 所以如果 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
的指针没有意义。在重新分配的数组中可访问的int
s 的数量将取决于int
类型的实际大小,这可能因系统而异。事实上,在某些架构上,100
甚至不是sizeof(int)
的倍数。作者可能打算写 p = realloc(p, sizeof(int) * 100);
或 p = realloc(p, sizeof(*p) * 100);
,并且片段周围的更多上下文可以帮助理解意图......正如所写的那样,这很可能是一个错误,原因有很多。
【讨论】:
谢谢。我只是复制了互联网站点上显示的示例之一。但我明白这一点。以上是关于将 realloc() 返回的地址分配给同一个指针是一种好的编码习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章