是否定义了行为实现?如果将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。什么时候发生?
答案 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
与内存管理返回的指针不匹配 函数,或者如果通过调用已释放空间free
或realloc
函数,行为未定义。如果 新对象的内存无法分配,旧对象是 没有解除分配,其价值不变。
因此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()
。