malloc(0)返回什么?

malloc(0)返回什么?,第1张

malloc(0)返回什么?

其他人已经回答了如何

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。(但是请注意,查看
ptr
after
的值
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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4894745.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存