如果我重新分配并且新大小为0会发生什么?这相当于免费吗?

给出以下代码:

int *a = NULL; a = calloc(1, sizeof(*a)); printf("%d\n", a); a = realloc(a, 0); printf("%d\n", a); return (0); 

它返回:

 4078904 0 

这个realloc是免费的吗?

注意:我在WindowsXP下使用MinGW。

不必要。

它通常与munissor发布的链接一样 ,但Mac OS 10.5手册页说:

如果size为零且ptr不为NULL,则会分配一个新的最小大小的对象,并释放原始对象。

什么是“最小尺寸物体”? 好吧,任何分配器都存储有关分配的一些信息,并且除了为用户保留的空间之外,还需要占用空间。 据推测,“最小尺寸对象”只是这些标题中的一个加上为用户保留的零字节空间。

我猜这个规定是为了支持标准化时存在的实现,并且这些实现对调试分配行为很有用。


解决乔纳森的评论

考虑之间的区别

 for (int i=0; i 

 for (int i=0; i 

有了一个理智的mallocfree实现,第一个剪辑不会消耗内存而不受限制。 但是如果realloc实现返回那些“最小大小的对象”,它可能会。

当然这个例子是人为的,它依赖于理解“最小尺寸对象”的含义,但我认为文本允许它。

简而言之,如果你的意思是 free你应该说是free

它可能或可能不等同于在指针上调用free ; 结果是实现定义的。

根据C99标准(§7.20.3/ 1):

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象。

这适用于所有内存管理function,包括realloc

C99标准§7.20.3.4(realloc)说:

realloc函数解除分配ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针。 新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止。 新对象中超出旧对象大小的任何字节都具有不确定的值。

如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。 否则,如果ptr与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc函数释放了空间,则行为未定义。 如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改。

这清楚地表明旧对象被释放(释放)。 返回值可能是空指针,也可能是§7.20.3的一般注释中指定的值:

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问对象。

无论哪种方式,您都不能取消引用返回的值:它可以用作free()的参数,或者只要它们不引用它就传递给其他函数。