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

use*_*520 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

blu*_*112 12

realloc(3)doc:

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

malloc(3)doc:

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

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

  • 如果你得到一个非空指针,你应该释放你得到的指针以避免泄漏,但不能解除引用(因为它提供0字节的合法可访问内存). (2认同)

dbu*_*ush 12

此行为是实现定义的.

C标准:

第7.22.3.5节(realloc):

3 如果ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数. 否则,如果ptr 与内存管理函数先前返回的指针不匹配,或者如果通过调用freeor realloc函数释放了空间,则行为未定义.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.

所以realloc(NULL, 0)是一样的malloc(0)

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

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

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

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

但是如果你看一下Linux 手册页:

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

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

相比之下,MSDN说:

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

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


unw*_*ind 6

电话

realloc(NULL, size);
Run Code Online (Sandbox Code Playgroud)

相当于

malloc(size);
Run Code Online (Sandbox Code Playgroud)

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