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,要么你可以释放指针.
dbu*_*ush 12
此行为是实现定义的.
从C标准:
第7.22.3.5节(realloc):
3 如果
ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数. 否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果通过调用freeorrealloc函数释放了空间,则行为未定义.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.
所以realloc(NULL, 0)是一样的malloc(0)
如果我们再看第7.22.3.4节(malloc):
2 该
malloc函数为大小由其指定size且其值不确定的对象分配空间.3该
malloc函数返回空指针或指向已分配空间的指针.
该标准没有说明0传入时会发生什么.
但是如果你看一下Linux 手册页:
该
malloc()函数分配大小字节并返回指向已分配内存的指针.内存未初始化.如果size为0,则malloc()返回NULL或稍后可成功传递给的唯一指针值free().
它明确声明可以释放返回的值,但不一定是NULL.
相比之下,MSDN说:
如果size为0,则malloc在堆中分配零长度项并返回指向该项的有效指针.始终检查malloc的返回,即使请求的内存量很小.
因此对于MSVC,您将不会获得NULL指针.
电话
realloc(NULL, size);
Run Code Online (Sandbox Code Playgroud)
相当于
malloc(size);
Run Code Online (Sandbox Code Playgroud)
什么malloc()时候被要求分配0字节有点不清楚,标准没有说.我认为它是实现定义的.它基本上"没关系"; 要么它返回NULL,要么它返回一个指针,您可以合法地访问零字节,这些非常相似.两者都可以传递给free().