其他人已经回答了如何
malloc(0)工作。我将回答您提出的尚未回答的问题之一(我认为)。问题是关于
realloc(malloc(0), 0):
什么
malloc(0)回报?答案会一样realloc(malloc(0),0)吗?
该标准规定
realloc(ptr, size):
- 如果
ptr
是NULL
,它的行为像malloc(size)
, - 否则(
ptr
不是NULL
),它将把旧的对象指针释放给by,ptr
并返回一个指向新分配的缓冲区的指针。但是如果size
为0,C89表示效果等同于free(ptr)
。有趣的是,我在C99草案(n1256或n1336)中找不到该语句。在C89中,在这种情况下返回的唯一有意义的值将是NULL
。
因此,有两种情况:
malloc(0)
返回NULL
实现。那么您的realloc()
通话等效于realloc(NULL, 0)
。这相当于malloc(0)
从上面开始(NULL
在这种情况下)。malloc(0)
返回non-NULL
。然后,该呼叫等效于free(malloc(0))
。在这种情况下,malloc(0)
和realloc(malloc(0), 0)
是 不 等效的。
请注意,这里有一个有趣的情况:在第二种情况下,如果成功
malloc(0)返回非
NULL成功,则它仍可能返回
NULL以指示失败。这将导致类似于这样的调用:
realloc(NULL,0),它等效于
malloc(0),可能会或可能不会返回
NULL。
我不确定C99中的遗漏是不是疏忽大意,或者这意味着C99中
realloc(ptr, 0)的非
NULL
ptr省略不等同于
free(ptr)。我只是试过了
gcc -std=c99,上面的内容等同于
free(ptr)。
编辑 :我想我理解您的困惑是什么:
让我们看一下示例代码中的一个片段:
ptr = malloc(0);if (ptr == realloc(ptr, 1024))
上面的内容与相同
malloc(0) == realloc(malloc(0),1024)。在第二个中,
malloc()调用进行了两次,而在第一个中,您将先前分配的指针传递给
realloc()。
让我们首先分析第一个代码。假设成功
malloc(0)不返回
NULL,
ptr则具有有效值。当您这样做时
realloc(ptr,1024),
realloc()基本上会为您提供一个大小为1024的新缓冲区,并且
ptr变为无效。符合条件的实现可能返回与已经存在的地址相同的地址
ptr。因此,您的
if条件可能会返回true。(但是请注意,查看
ptrafter
的值
realloc(ptr, 1024)可能是未定义的行为。)
现在您问的问题是:
malloc(0) == realloc(malloc(0),1024)。在这种情况下,我们假设
malloc(0)LHS和RHS上的都返回non-
NULL。然后,保证它们是不同的。此外,从返回值
malloc()的LHS一直没有
free()d还,所以任何其他
malloc(),
calloc()或
realloc()可能不会返回值。这意味着如果您将条件写为:
if (malloc(0) == realloc(malloc(0), 1024) puts("possible");
您将不会
possible在输出中看到(除非
malloc()和
realloc()失败并返回
NULL)。
#include <stdio.h>#include <stdlib.h>int main(void){ void *p1; void *p2; p1 = malloc(0); p2 = realloc(p1, 1024); if (p1 == p2) puts("possible, OK"); if (malloc(0) == realloc(malloc(0), 1024)) puts("shouldn't happen, something is wrong"); return 0;}
在OS X上,我的代码在运行时没有输出任何内容。在Linux上,它将打印
possible, OK。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)