如果将 NULL 和大小 0 传递给 realloc() 会怎样?

2024-03-13

行为实现是否已定义?如果 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。什么时候会发生这种情况?


此行为是实现定义的。

来自C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf:

第 7.22.3.5 条(realloc):

3 If ptr是一个空指针,则realloc函数的行为类似于malloc指定大小的函数。否则,如果ptr与内存管理先前返回的指针不匹配 函数,或者如果空间已通过调用释放 这free or realloc函数,行为未定义。如果 无法为新对象分配内存,旧对象已被分配 没有被释放并且它的值没有改变。

So realloc(NULL, 0)是相同的malloc(0)

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

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

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

该标准没有说明什么时候会发生什么0被传入。

但如果你看看 Linuxman page https://linux.die.net/man/3/malloc:

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

它明确指出返回值可以被释放,但不一定是 NULL。

相比之下,MSDN https://msdn.microsoft.com/en-us/library/6ewkz86d.aspx says:

如果 size 为 0,malloc 会在堆中分配一个零长度的项,并 返回指向该项目的有效指针。始终检查返回 malloc,即使请求的内存量很小。

所以对于 MSVC,你不会得到 NULL 指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果将 NULL 和大小 0 传递给 realloc() 会怎样? 的相关文章

随机推荐