【问题标题】:calloc() usage and checking for failure in Ccalloc() 在 C 中的用法和检查失败
【发布时间】:2014-12-25 23:31:42
【问题描述】:

生日快乐!

通常如果我使用 malloc,我会通过以下方式检查失败:

int *A;

A=(int *)malloc(NUM_ELEMENTS*sizeof(int));
if (!A) {
    printf("mem failure, exiting \n");
    exit(EXIT_FAILURE);
}

我可以为 calloc 做同样的事情吗,即使所有的东西都被赋值为 0?我的直觉是肯定的,因为我们要检查 A 的内存地址,而 A[0] 为 0 无关紧要,内存地址不会为空,除非它失败。

【问题讨论】:

    标签: c malloc dynamic-memory-allocation realloc calloc


    【解决方案1】:

    OP 的代码同样适用于 malloc()calloc()

    但 OP 不正确,“除非失败,否则内存地址不会为空。”

    如果请求的分配大小为 0,则返回的指针可能NULL

    "如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,但不应使用返回的指针访问一个对象。” C11dr §7.22.3.1 1

    更便携的解决方案:

    A = calloc(NUM_ELEMENTS, sizeof *A);
    A = malloc(NUM_ELEMENTS * sizeof *A);
    
    // Add size check
    if (!A && NUM_ELEMENTS != 0) {
       fputs("mem failure, exiting \n", stderr);
       exit(EXIT_FAILURE);
    }
    

    当然,如果NUM_ELEMENTS 始终 > 0,则不需要此额外检查。

    【讨论】:

      【解决方案2】:

      是的,您可以像malloc 一样对calloc 进行错误检查。然而,由于calloc 是相当可靠的失败明智之举,您通常不需要这样做,正如此处how can i know if calloc fails to initialize 所解释的那样。

      【讨论】:

      • @AggressiveSneeze。没问题的伙伴!祝你好运!
      • 包含检查仍然可以捕获错误,例如尝试分配比可用内存更多的内存。我在 32 位架构上运行 calloc(big_calculated_number) 被抓住了;检查 calloc 是否成功会为我节省一天的错误搜索!
      【解决方案3】:

      是的,你的想法是正确的。出于您所述的原因,您可以使用 calloc 进行相同的检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 2021-10-09
        • 2022-01-16
        • 2012-10-26
        • 2012-05-11
        • 1970-01-01
        • 2020-11-26
        相关资源
        最近更新 更多