如果NULL和大小0传递给realloc()怎么办?

时间:2017-02-17 16:22:13

标签: c memory-management realloc

是否定义了行为实现?如果将NULL和size == 0传递给realloc()

int main(void)
{
    int *ptr = NULL;

    ptr = realloc(ptr, 0);

    if(ptr == NULL)
    {
        printf("realloc fails.\n");
        goto Exit;
    }

    printf("Happy Scenario.\n");

Exit:
    printf("Inside goto.\n");

return 0;
}

上面的代码应该打印" realloc失败",对吧?但事实并非如此?我已经在某地读过这个对realloc的调用也可能返回NULL。什么时候发生?

3 个答案:

答案 0 :(得分:12)

realloc(3)doc:

  

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

,调用等效于malloc(size)

malloc(3)doc:

  

如果size为0,则malloc()返回NULL或唯一的指针值,以后可以成功传递给free()。​​

所以是的,它是实现定义的,你要么得到null,要么你可以释放指针。

答案 1 :(得分:11)

此行为是实现定义的。

来自C standard

第7.22.3.5节(realloc):

  

3 如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。否则,如果ptr   与内存管理返回的指针不匹配   函数,或者如果通过调用已释放空间   freerealloc函数,行为未定义。如果   新对象的内存无法分配,旧对象是   没有解除分配,其价值不变。

因此realloc(NULL, 0)malloc(0)

相同

如果我们再看第7.22.3.4节(malloc):

  

2 malloc函数为大小由size指定且其值不确定的对象分配空间。

     

3 malloc函数返回空指针或指向已分配空间的指针。

该标准未说明传递0时会发生什么。

但是如果你看一下Linux man page

  

malloc()函数分配大小字节并返回指向的指针   分配的内存。内存未初始化。 如果大小为0,   然后malloc()返回NULL或可以的唯一指针值   稍后会成功传递到free()

它明确声明可以释放返回的值,但不一定是NULL。

相比之下,MSDN说:

  

如果size为0,则malloc在堆中分配一个零长度项   返回指向该项的有效指针。务必检查退货   malloc,即使请求的内存量很小。

因此,对于MSVC,您将不会获得NULL指针。

答案 2 :(得分:6)

电话

realloc(NULL, size);

相当于

malloc(size);

当被要求分配0字节时malloc()所做的事情有点不清楚,标准没有说。我认为它是实现定义的。它基本上“没关系”;要么它返回NULL,要么它返回一个指针,您可以合法访问零字节,这些非常相似。两者都可以传递给free()