释放malloc(0)的内存空间

3

我正在使用C语言编写一个应用程序,其中为一些数组动态分配所需的内存。我知道许多这些数组将不需要任何内存分配。那么,当我对它们调用free函数时会有问题吗?例如free(malloc(0 * sizeof(int)));?我知道我的应用程序在我的计算机上编译和运行正常,但我可以依赖它吗?谢谢!


1
请注意 malloc(0)实现定义 - Mysticial
@Mysticial: 是的,但你可以释放它返回的任何结果(无论是有效指针还是NULL),对吧? - Fred Larson
这与数组的零初始化有什么关系? - Fred Foo
@FredLarson 正确,但如果 malloc(0) 返回 NULL,它可能会触发检查内存是否不足的操作,这些操作会检查 NULL - Mysticial
1
@FredLarson:哦,抱歉,我看错了。我的眼睛可能有点累了。 - Fred Foo
显示剩余4条评论
4个回答

8
您可以安全地使用 free(malloc(0))
man malloc 中得知:
如果 size0,那么 malloc() 要么返回 NULL,要么返回一个唯一的指针值,该指针值稍后可以成功传递给 free()
free:
如果 ptrNULL,则不执行任何操作。

哎呀!所以我可以安全地调用free(),但是当我调用malloc()时,我也会检查结果,例如:if(!(arr = malloc(0))){开始尖叫!}...如果malloc(0)是实现相关的,那么这将失败,对吧? - Stamoulohta
1
如果你认为malloc()返回NULL是一个错误,那么你就不能调用malloc(0)malloc()在失败时会将errno设置为ENOMEM,因此你可以检查它。 - sverre
1
在这里使用 errno,你必须在调用 malloc 之前将其设置为0,即使如此,它的可靠性也不如我所希望的那样高。更好的测试方法是,在 malloc 返回 null 后仅检查大小参数是否为0,在这种情况下它不是一个失败。 - R.. GitHub STOP HELPING ICE

4
malloc(0)可能(这是实现定义)返回空指针,也可能每次调用时返回新指针。无论哪种情况,返回值都可以传递给free,因为free(0)本身不执行任何操作。然而,由于在检测和处理realloc失败以及ISO C和POSIX之间存在争议的一些棘手问题,我强烈建议您永远不要将大小为0的参数传递给mallocrealloc。您可以始终在malloc参数的末尾添加+1|1,这样每次调用它时就可以确保获得唯一指针(与空指针或任何其他对象的地址不同)。

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


1

在编程中,调用malloc的结果上使用free是合法的(仅限一次)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接