c-为什么malloc(0)在Windows中返回非空地址



下面的代码在Windows中执行时返回一个地址,尽管我希望它返回NULL。

int main()
{
   char *ptr = NULL;
   ptr = malloc(0);
   printf("malloc returned = %un", ptr);
}

是什么促使了malloc的实现?这背后有什么原因吗?

因为这是一个0字节的内存,所以我没有尝试写任何数据。但是,这种记忆可以用来做任何事情吗?

这只是您请求的最小大小。由于Win32堆中没有零长度的块,您可以:

void *p = malloc(0);
// ... do some stuff in between...
realloc(p, n);

这应该主要导致重用堆的一个块(如果幸运的话,并且新的大小很小)。一个小的机会主义优化(或减速,取决于上下文和血咖啡水平)。

这是一个简化的例子。实际情况可能是一个类,它在创建缓冲区时分配缓冲区,并允许扩展缓冲区。如果输入很难控制,你可以让它进行零大小的缓冲区分配。

要回答问题的第二部分,否,内存不能用于任何事情,因为"它的可访问部分"是从返回的地址开始的0字节。

IIRC可以保证,如果实现确实返回非null,那么它将是与任何其他当前分配的内存块不同的地址。因此,理论上,你可以将地址用作(指针类型的)临时唯一ID,尽管显然有很多其他方法可以获得唯一ID。即使你要使用它,malloc(1)也会和malloc(0)一样好用,而且更便携。

这在comp.lang.cFAQ中得到了回答:http://c-faq.com/ansi/malloc0.html

ANSI/ISO标准说,它可以做任何一种;行为是由实现定义的(参见问题11.33)。可移植代码必须注意不要调用malloc(0),或者为返回null的可能性做好准备。

标准规定它可以进行

http://pubs.opengroup.org/onlinepubs/009695399/functions/malloc.html

这并没有什么用处。malloc返回的块应该是唯一的。因此,malloc返回的每个块都携带块内的数据和它的唯一标识符,即它的地址。如果后一个属性很重要,并且它不包含数据这一事实不是问题,那么它是有用的。

然而,正如前面提到的,这是编写不可移植代码的好方法。然而,这与非法代码不同,它对于支持它的实现来说是完全有效的(就像windows所做的那样)。

相关内容

  • 没有找到相关文章

最新更新