什么malloc(0)
回报?
答案会一样realloc(malloc(0),0)
吗?
#include<stdio.h>
#include<malloc.h>
int main()
{
printf("%p\n", malloc(0));
printf("%p\n", realloc(malloc(0), 0));
return 0;
}
Linux GCC的输出:
manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
输出每次都会保持变化malloc(0)
。这是标准答案吗?为什么除了学术研究之外,还有谁会对获得这样的指示感兴趣?
编辑:
如果malloc(0)
返回伪指针,则以下内容如何工作:
int main()
{
void *ptr = malloc(0);
printf("%p\n", realloc(ptr, 1024));
return 0;
}
编辑:
以下代码为每次迭代输出“可能”。为什么不失败?
#include<stdio.h>
#include<malloc.h>
int main()
{
int i;
void *ptr;
printf("Testing using BRUTE FORCE\n");
for (i=0; i<65000; i++)
{
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
printf("Iteration %d: possible\n", i);
else
{
printf("Failed for iteration %d\n", i);
break;
}
}
return 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");
/* Ignore the memory leaks */
if (malloc(0) == realloc(malloc(0), 1024))
puts("shouldn't happen, something is wrong");
return 0;
}
在OS X上,我的代码在运行时没有输出任何内容。在Linux上,它将打印possible, OK
。
我知道(-0==0)是真的。我很想知道为什么-0 当我在stackoverflow执行上下文中运行这段代码时,它返回。 但是当我在浏览器控制台中运行相同的代码时,它返回。那是为什么呢?我试图在谷歌上搜索它,但没有找到任何有用的东西。这个问题可能不会给某个人的实际例子增加价值,我想了解JS是如何计算它的。
问题内容: 我有这样的事情: 而且我总是得到“时钟周期为:0-0”的输出 知道为什么会这样吗? (仅给出一点点细节,something_else()函数使用蒙哥马利表示法执行从左到右的求幂运算,而且我不确定不确定something_else()函数确实花费了一些不可忽略的时间。) 这是在Linux上。uname -a的结果是: 问题答案: 该功能不测量CPU时钟周期。 C说: “ 从实现定义的仅与
问题内容: 为什么以下返回0? 问题答案: 月份从0(一月)到11(十二月)进行编号。 参考:
问题内容: 我有以下代码。应该返回表的最后一行的mysqli_insert_id()(在本例中为“ $ last_row”)始终返回0。为什么会这样呢? 问题答案: 并 没有 返回表的最后一排的ID。从文档中,它: …返回由查询产生的ID,该查询是对具有具有AUTO_INCREMENT属性的列的表进行的。如果最后一个查询不是or 语句,或者如果修改后的表没有带有属性的列,则此函数 将返回零 。 (
问题内容: 我在jsfiddle.net上玩,我很好奇为什么返回true? 这样: 但这不是: 这个怪癖有用吗? 问题答案: 操作顺序导致在javascript中解释为产生,并且true计为1,导致其返回true。 这也是为什么返回false,返回true,为什么将其解释为,从而导致的原因。
问题内容: 在Python 2.6中查看Queue.py时,我发现这个结构有点奇怪: 如果maxsize为0,则队列永远不会满。 我的问题是在这种情况下如何运作?如何0 < 0 == 0被认为是错误的? 问题答案: 我相信Python对关系运算符的序列有特殊的处理方式,以使范围比较易于表达。能说比说好得多。 这些称为链接比较。这是他们文档的链接。 在您谈论的其他情况下,括号会强制在一个关系运算符之