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

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

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

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

所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。谁能告诉我将 realloc() 返回的地址分配给同一个指针是一种好的编码习惯吗?

【问题讨论】:

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

标签: c pointers memory-management return realloc


【解决方案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);,并且片段周围的更多上下文可以帮助理解意图......正如所写的那样,这很可能是一个错误,原因有很多。

    【讨论】:

    • 谢谢。我只是复制了互联网站点上显示的示例之一。但我明白这一点。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2017-12-09
    • 2020-09-16
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多