本文介绍了如果将 NULL 和大小 0 传递给 realloc() 会怎样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is the behavior implementation defined? If NULL and size == 0 are passed to 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 failed",对吧?但不是吗?我在某处读到过对 realloc 的调用也可能返回 NULL.什么时候会发生?

The above code should print "realloc fails", right? But it is not? I've read somewhere that this call to realloc may return NULL also. When does that happen?

推荐答案

此行为是实现定义的.

来自 C 标准:

第 7.22.3.5 节(realloc):

Section 7.22.3.5 (realloc):

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

所以 realloc(NULL, 0)malloc(0)

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

If we then look at section 7.22.3.4 (malloc):

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

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

3 The malloc function returns either a null pointer or a pointer to the allocated space.

标准没有说明传入 0 时会发生什么.

The standard does not state what happens when 0 is passed in.

但是如果您查看 Linux 手册页:

But if you look at the Linux man page:

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

明确声明返回值可以被释放,但不一定是NULL.

It explicitly states that the returned value can be freed but is not necessarily NULL.

相比之下,MSDN 说:

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

因此对于 MSVC,您不会得到 NULL 指针.

So for MSVC, you won't get a NULL pointer.

这篇关于如果将 NULL 和大小 0 传递给 realloc() 会怎样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 12:37