c释放malloc(0)
我正在用c编写一个应用程序,其中动态分配一些数组所需的内存。我知道许多阵列需要零分配。那么,当我免费打电话给他们时会有问题吗?例如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
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,在这种情况下,这不是失败。