c释放malloc(0)

c释放malloc(0),c,malloc,free,zero,C,Malloc,Free,Zero,我正在用c编写一个应用程序,其中动态分配一些数组所需的内存。我知道许多阵列需要零分配。那么,当我免费打电话给他们时会有问题吗?例如free(malloc(0*sizeof(int))?我知道我的应用程序在我的机器上编译和运行正常,但我能依靠它吗?干杯 根据malloc的结果调用free(一次)始终是合法的。是的,free(malloc(0))保证有效 有关进一步的讨论,请参见您可以安全地免费(malloc(0)) 从man malloc的开始: 如果size为0,则malloc() 返回NULL

我正在用c编写一个应用程序,其中动态分配一些数组所需的内存。我知道许多阵列需要零分配。那么,当我免费打电话给他们时会有问题吗?例如
free(malloc(0*sizeof(int))?我知道我的应用程序在我的机器上编译和运行正常,但我能依靠它吗?干杯

根据
malloc
的结果调用
free
(一次)始终是合法的。

是的,
free(malloc(0))
保证有效

有关进一步的讨论,请参见您可以安全地
免费(malloc(0))

从man malloc的
开始:

如果
size
0
,则
malloc()
返回
NULL
,或一个以后可以重复的唯一指针值 成功地传递到
free()

免费:

如果
ptr
NULL
,则不执行任何操作

malloc(0)
可能(这是实现定义的)返回空指针,或者每次调用它时都可能返回新指针。在任何一种情况下,返回值都可以有效地传递到
free
,因为
free(0)
无论如何都是无操作的。但是,由于在检测和处理
realloc
故障方面存在一些严重的问题,以及ISO C和POSIX之间存在分歧,我强烈建议您不要将大小0传递给
malloc
realloc
。您总是可以简单地将
+1
|1
添加到
malloc
的参数末尾,然后每次调用它时都会得到一个唯一的指针(不同于空指针或任何其他对象的地址)


不使用
malloc(0)
的另一个原因是,您必须始终检查
malloc
的返回值以检测失败,而
malloc(0)
在成功时可以返回空指针。这使得所有的错误检查代码变得更加复杂,因为您必须对size参数为0的非错误情况进行特殊处理。

请注意
malloc(0)
是。@Mysticial:是的,但您可以
释放它返回的任何结果(有效指针或NULL),对吗?这与数组的零初始化有什么关系?@fredrarson正确,但是如果
malloc(0)
返回
NULL
,它可能会触发检查
NULL
的内存不足检查@fredrarson:哦,对不起,误读了。我的眼睛一定累了。哎呀!所以我可以安全地调用
free()
,但是,当我调用
malloc()
时,我也会检查结果,比如:
如果(!(arr=malloc(0)){开始尖叫!}
。。。如果
malloc(0)
依赖于实现,这将失败,对吗?是的,如果您认为
malloc()
返回
NULL
是一个错误,那么您就不能调用
malloc(0)
malloc()
将在失败时将
errno
设置为
ENOMEM
,因此您可以检查它。要在此处使用
errno
,您必须在调用
malloc
之前将其设置为0,即使如此,它的可靠性也不如我所希望的那样高。更好的测试是在
malloc
返回null后检查size参数是否为0,在这种情况下,这不是失败。