关于realloc功能的困惑

时间:2017-11-13 14:14:52

标签: c language-lawyer realloc

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

那个文件Say:

  

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;
}

根据该引用,它是否也是未定义的行为?

我的第二种情况不会调用未定义的行为。我是对的吗?

4 个答案:

答案 0 :(得分:10)

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

另一方面,由于realloc在传递空指针值时具有明确定义的行为(它就像调用malloc 1 ,第二个一段代码是完全合法的(除了事实上你没有free任何东西)。

1 7.22.3.5 realloc函数/ p3

  

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

答案 1 :(得分:1)

在第一种情况下,程序几乎肯定将由segmentation fault完成,因为在堆中创建的链接列表不能连贯,在第二种情况下,您使用NULL第一个参数调用realloc,这意味着,是一个等同于malloc(size)

的电话

man realloc说:

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

如果 ptr 为NULL,则对于所有大小值

,调用等效于malloc(size)

答案 2 :(得分:1)

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

§7.22.3.5realloc函数,p3

  

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

所以,你的第二个例子定义明确。

答案 3 :(得分:1)

  1. 第一种情况显然是未定义的行为,因为我们不知道 ptr 指向的位置或 ptr 当时持有的内容。 c标准表示 7.20.3.4.2 realloc功能
  2.   

    realloc函数释放ptr和指向的旧对象   返回指向大小指定大小的新对象的指针。

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

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

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