行为实现是否已定义?如果 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(使用前将#替换为@)