我正在使用C语言编写一个应用程序,其中为一些数组动态分配所需的内存。我知道许多这些数组将不需要任何内存分配。那么,当我对它们调用free函数时会有问题吗?例如free(malloc(0 * sizeof(int)));
?我知道我的应用程序在我的计算机上编译和运行正常,但我可以依赖它吗?谢谢!
free(malloc(0))
。man malloc
中得知:size
是 0
,那么 malloc()
要么返回 NULL
,要么返回一个唯一的指针值,该指针值稍后可以成功传递给 free()
。ptr
是 NULL
,则不执行任何操作。free()
,但是当我调用malloc()
时,我也会检查结果,例如:if(!(arr = malloc(0))){开始尖叫!}
...如果malloc(0)
是实现相关的,那么这将失败,对吧? - Stamoulohtamalloc()
返回NULL
是一个错误,那么你就不能调用malloc(0)
。malloc()
在失败时会将errno
设置为ENOMEM
,因此你可以检查它。 - sverreerrno
,你必须在调用 malloc
之前将其设置为0,即使如此,它的可靠性也不如我所希望的那样高。更好的测试方法是,在 malloc
返回 null 后仅检查大小参数是否为0,在这种情况下它不是一个失败。 - R.. GitHub STOP HELPING ICEmalloc(0)
可能(这是实现定义)返回空指针,也可能每次调用时返回新指针。无论哪种情况,返回值都可以传递给free
,因为free(0)
本身不执行任何操作。然而,由于在检测和处理realloc
失败以及ISO C和POSIX之间存在争议的一些棘手问题,我强烈建议您永远不要将大小为0的参数传递给malloc
或realloc
。您可以始终在malloc
参数的末尾添加+1
或|1
,这样每次调用它时就可以确保获得唯一指针(与空指针或任何其他对象的地址不同)。
不使用malloc(0)
的另一个原因是您必须始终检查malloc
的返回值以检测失败,而malloc(0)
可以在成功时返回空指针。这使得所有错误检查代码更加复杂,因为您必须特别处理大小参数为0的非错误情况。
在编程中,调用malloc
的结果上使用free
是合法的(仅限一次)。
malloc(0)
是实现定义。 - Mysticialmalloc(0)
返回NULL
,它可能会触发检查内存是否不足的操作,这些操作会检查NULL
。 - Mysticial