我尝试过释放内存而不使用free()
,如下所示
int *ptr = malloc(20);
realloc(ptr, 0);
它会起作用吗?
答案 0 :(得分:12)
C语言标准在这一方面有所不同:在C90中传递零大小与调用free
相同:
如果size为零,则先前在ptr分配的内存将被释放,就像调用free一样,并返回空指针。
然而,这在C99中发生了变化:
如果size为零,则返回值取决于特定的库实现:它可以是空指针或其他不应被解除引用的位置。
请注意,不再需要释放;当零尺寸通过时,两者都没有返回NULL
。
答案 1 :(得分:2)
realloc(ptr, 0)
不等同于free(ptr)
标准C11
说:
如果请求的空间大小为零,则行为是实现定义的: 返回空指针,或者行为就像大小一样 非零值,但返回的指针不得用于访问 宾语。
为什么因为realloc
做了以下事情,
答案 2 :(得分:1)
也许,但你不能指望它。来自文档:
如果new_size为零,则行为是实现定义的(可能返回空指针,或者可能返回一些可能不用于访问存储的非空指针)。
答案 3 :(得分:0)
至少对于POSIX:realloc(p, 0)
与free(p)
不同。
来自the current POSIX documentation on realloc()
:
以前的版本明确允许调用 realloc(p,0)来释放p指向的空格并返回空指针。虽然此行为可能被解释为此版本标准允许,但C语言委员会已表明此解释不正确。