【问题标题】:Is a malloc() needed before a realloc()?在 realloc() 之前是否需要 malloc()?
【发布时间】:2010-12-16 09:40:38
【问题描述】:

由于我已经阅读 realloc 将在指向的大小为 0 时充当 malloc,因此我在没有 malloc() 的情况下使用它,前提是指针是静态的、全局的,或者如果是自动的,则显式设置为 NULL。

但是,我注意到很多程序员尝试设置它或将其设置为 malloc(1)。需要吗?

【问题讨论】:

    标签: c memory-management malloc alloc


    【解决方案1】:

    来自Open Groups' specifications

    如果 ptr 是空指针,realloc() 应等同于 malloc() 指定的大小。

    如果 ptr 不匹配指针 calloc() 之前返回的, malloc() 或 realloc() 或如果空间 之前已被解除分配 调用 free() 或 realloc(), 行为未定义。

    【讨论】:

      【解决方案2】:

      malloc 不是必需的,您可以只使用realloc

      malloc(n) 等价于realloc(NULL, n)

      但是,使用malloc 而不是realloc 的特殊语义通常更清晰。这不是什么有效的问题,而是不要让阅读代码的人感到困惑。

      (编辑:删除提及 realloc 充当 free,因为它不是标准 C。请参阅 cmets。)

      【讨论】:

      • 请注意,大小为 0 的 realloc 的 C99 标准与 POSIX 标准略有不同。 C99 标准就是这样说的:如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为就好像大小是某个非零值
      • 那么当 p 不为 NULL 时,可以执行“p = malloc(n)”后跟“realloc(p, 0)”吗?我真的不会这样做!对格式感到抱歉
      • Jeremy,这不是与“要求的”尺寸有关吗?它与前一个指针的重新分配有什么关系?
      • realloc(p,0) 不幸的是不等同于free(p)。普通 C 和 POSIX 都允许实现返回一个新指针,该指针指向您不允许写入的区域(它具有“长度 0”)来代替 NULL。可悲的是 glibc 就是这样一种实现,并且不乏错误的程序,它们期望 glibc 行为并使用这些大量浪费的“大小 0”分配(每个占用至少 16 个字节)进行自己的记账。
      • @R.,有趣,你是对的。我只检查了realloc 的 Linux 联机帮助页,而不是 C 标准。该标准并未暗示realloc 能够释放内存。我会相应地编辑我的答案。
      猜你喜欢
      • 2012-07-17
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多