【问题标题】:c freeing malloc(0)c 释放 malloc(0)
【发布时间】:2012-02-07 03:52:33
【问题描述】:

我正在用 c 语言编写一个应用程序,在其中动态分配某些数组所需的内存。我知道其中许多数组都需要零分配。那么,当我免费调用它们时会有问题吗?例如free(malloc(0 * sizeof(int)));?我知道我的应用程序在我的机器上编译和运行正常,但我可以依赖这个吗?干杯!

【问题讨论】:

  • 请注意malloc(0)implementation defined
  • @Mysticial:是的,但是你可以free它返回的任何结果(有效指针或NULL),对吧?
  • 这与数组的零初始化有什么关系?
  • @FredLarson 正确,但如果malloc(0) 返回NULL,它可能会触发检查NULL 的内存不足检查。
  • @FredLarson:哦,对不起,误读了。我的眼睛一定是累了。

标签: c malloc free zero


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以放心地free(malloc(0))

    来自man malloc

    如果size0,那么malloc() 返回NULL 或稍后可以成功的唯一指针值 成功传递给free()

    免费:

    如果ptrNULL,则不进行任何操作

    【讨论】:

    • 糟糕!所以我可以安全地调用free(),但是当我调用malloc() 时,我也会检查结果,例如:if(!(arr = malloc(0))){ start screaming!}...如果malloc(0) 依赖于实现,这将失败,对吧?
    • 是的,如果你认为malloc() 返回NULL 是一个错误,那么你不能调用malloc(0)malloc() 将在失败时将 errno 设置为 ENOMEM,因此您可以改为检查。
    • 要在此处使用errno,您必须在调用malloc 之前将其设置为0,即便如此,它也没有我想要的可靠。更好的测试是在 malloc 返回 null 后检查 size 参数是否为 0,在这种情况下它不是失败。
    【解决方案3】:

    是的,free(malloc(0)) 保证可以工作。

    如需进一步讨论,请参阅what's the point in malloc(0)?

    【讨论】:

      【解决方案4】:

      malloc 的结果上调用free 总是合法的(一次)。

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        相关资源
        最近更新 更多