【问题标题】:Confusion about realloc function关于 realloc 函数的困惑
【发布时间】:2018-04-26 06:08:20
【问题描述】:

我使用 this 参考阅读了 C 中的动态内存分配。

那个文件说的:

realloc() 应该只用于动态分配的内存。如果 内存不是动态分配的,所以行为是不确定的。

如果我们使用realloc() 这样的东西:

int main()
{
    int *ptr;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}

根据那个引用,这个程序是未定义的,因为指针 ptr 不是动态分配的。

但是,如果我使用类似的东西:

int main()
{
    int *ptr = NULL;
    int *ptr_new = (int *)realloc(ptr, sizeof(int));

    return 0;
}

根据该参考,它是否也是未定义的行为?

我认为第二种情况不会引发未定义的行为。我说的对吗?

【问题讨论】:

  • 您提到的文档不完整。请参阅下面讲故事的人的回答。
  • 在 C 中,您不应该将 realloc 的返回值转换为与 malloc 相同的原因:stackoverflow.com/questions/605845/…

标签: c language-lawyer realloc


【解决方案1】:
  1. 第一种情况显然是未定义的行为,因为我们不知道 ptr 指向的位置或当时 ptr 持有什么。而c标准说7.20.3.4.2的realloc函数

realloc 函数释放 ptr 指向的旧对象并 返回一个指向新对象的指针,该对象的大小由 size 指定。

所以第一种情况是未定义的行为。

  1. 在第二种情况下,编译器知道 ptr 有什么,所以它是有效的,但 realloc() 根据7.20.3.4.3 realloc 函数将充当malloc()

如果 ptr 是空指针,realloc 函数的行为类似于 指定大小的 malloc 函数。

【讨论】:

    【解决方案2】:

    唯一的权威参考是标准文档。 n1570(最新的C11标准)有以下说法:

    §7.22.3.5 realloc 函数,p3

    如果 ptr 是空指针,则 realloc 函数的行为类似于 malloc 函数 规定的大小。否则,如果ptr 与内存先前返回的指针不匹配 管理功能,或者如果空间已通过调用 freerealloc 函数,行为未定义。 [...]

    所以,您的第二个示例定义明确。

    【讨论】:

      【解决方案3】:

      在第一种情况下,程序几乎肯定会在segmentation fault 结束,因为在堆中创建的用于查找段的链表不连贯,在第二种情况下,您使用 NULL 第一个参数调用 realloc,这意味着, 是等效于malloc(size)的调用

      man realloc 说:

         void *malloc(size_t size); 
         void *realloc(void *ptr, size_t size);
      

      如果 ptr 为 NULL,则调用等效于 malloc(size),对于所有 size 值

      【讨论】:

        【解决方案4】:

        第一种情况有未定义的行为,而第二种情况没有。在第一种情况下,ptr 的值是不确定的。因此,将该值传递给 realloc 或任何函数本身是未定义的。

        另一方面,由于realloc 在传递空指针值时具有明确定义的行为(就像调用malloc1,第二段代码是完全合法的(其他而不是你没有free 任何东西)。


        17.22.3.5 realloc函数/p3

        如果 ptr 是空指针,则 realloc 函数的行为类似于指定大小的 malloc 函数。

        【讨论】:

          猜你喜欢
          • 2015-04-08
          • 2020-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          • 2011-11-21
          相关资源
          最近更新 更多