c - 对 realloc 函数的混淆



我使用此参考阅读了有关 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;
}

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

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

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

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


1 7.22.3.5 realloc函数/p3

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

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

man realloc 说:

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

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

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

§7.22.3.5 realloc函数,p3

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

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

  1. 第一种情况显然是未定义的行为,因为我们不知道 ptr 指向哪里或 ptr 当时持有什么。而c标准说7.20.3.4.2 realloc函数

realloc 函数解除分配由 ptr 和 返回指向具有由 size 指定的大小的新对象的指针。

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

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

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

最新更新