【问题标题】:when is realloc() equivalent to malloc() in C?什么时候 realloc() 等同于 C 中的 malloc()?
【发布时间】:2016-06-26 14:35:52
【问题描述】:

在这段代码 sn-p 中,realloc 相当于 malloc 但我无法得到逻辑。

int *ptr=(int*) realloc(NULL,10*sizeof(int));

为什么要创建一个新块,因为 NULL 是在 stdio.h 中定义为 0 的宏,所以这意味着它指向在大多数机器中是系统区域的基地址 0,那么 realloc 如何开始分配内存从基地址 0 到 10 个整数,为什么这不是分段错误?

【问题讨论】:

  • 传递 NULL 并不意味着将使用地址 0。
  • 但它是一个值为 0 的宏,而 realloc 的第一个参数是一个指针,所以当我们将 0 传递给一个指针变量时,它暗示 0 是一个地址不是吗?
  • 你做了很多不正确的假设。
  • documentation 对此非常清楚。
  • 谷歌也是如此。谷歌搜索您的确切标题给出:“大约 78,500 个结果”,您的问题作为第一个条目,其答案作为第二个条目。如果您没有先询问 SO,那么您的答案就会排在首位。

标签: c


【解决方案1】:

澄清一下:这意味着函数 realloc 检查其第一个参数是否为 0(NULL 指针),如果是,则其行为类似于 malloc 或只是调用 malloc

【讨论】:

    【解决方案2】:

    那么realloc如何从基地址0开始分配内存

    来自realloc手册:

    如果 ptr 是一个空指针,该函数的行为类似于 malloc,分配一个新的 size 字节块并返回一个指向其开头的指针。

    所以如果前一个指针为 NULL,并不意味着realloc 必须从基地址 0 开始分配。实际上,它的行为类似于malloc,分配一个新的内存块。

    【讨论】:

      【解决方案3】:

      NULL 是在 stdio.h 中定义为 0 的宏,因此它意味着它指向基地址 0

      那不是真的。 NULL 是空指针的宏,它不一定指向基地址0。见C FAQ


      要回答您的主要问题,realloc 在第一个参数是空指针时的行为类似于 malloc

      【讨论】:

      • 为了挑剔,NULL是a空指针constant的宏。分配了空指针常量的指针将成为空指针。所以没有什么叫做“ 空指针”。欲了解更多信息,see this
      【解决方案4】:

      另一个答案,所有人都解释得很漂亮,但错过了一些好的观察。

      以下行为取自 Linux man。您可能喜欢为您的平台阅读文档。 realloc(void *ptr, size_t size) 一直有一个糟糕的设计,例如尝试执行许多任务

      1) 如果ptr == NULL,它的行为类似于malloc(size)

      2) 如果ptr != NULL && size == 0,它的行为类似于free(ptr)

      更多详情请访问man 3 realloc

      因此,最好有一个 realloc 的包装器,尤其是用于使用 像ptr = realloc(ptr, size); 这样会导致泄漏。

      void* my_realloc(void *oldPtr, size_t newSize)
      {
          void *newPtr = NULL;
          if ( (newPtr = realloc( oldPtr, newSize) ) == NULL) 
          {
              free( oldPtr);
              return NULL;
          }
          return newPtr;
      }
      

      【讨论】:

      • realloc(some_pointer, 0) 返回NULL 或非NULL 指针。 IMO,realloc() 规范中的一个弱点。 my_realloc() 也是如此 - 那里没有任何改进。如果realloc(some_pointer, 0) 返回非NULL 则更好,因此返回值NULL only 发生错误。
      • #2 不正确。 realloc(not_null_pointer, 0) 可能会返回一个有效的(非NULL)指针。它不像free()
      • linux没有定义C,C标准定义了C。“如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为如如果大小是某个非零值,则返回的指针不应用于访问对象。” §7.22.2.1 帖子未标记 [linux]。
      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2010-10-19
      相关资源
      最近更新 更多