calloc()用法和检查C中的失败

时间:2014-10-30 02:56:41

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

G'!天

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

int *A;

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

即使所有内容都分配给0,我能为calloc做同样的事情吗?我的直觉是肯定的,因为我们正在检查A的mem地址,并且A [0]为0并不重要,除非失败,否则mem地址不会为空。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

是的,您可以像calloc一样对malloc进行错误检查。但是,由于calloc非常坚如磐石,因此您通常不需要这样做,如how can i know if calloc fails to initialize所述。

答案 2 :(得分:1)

OP的代码也适用于malloc() calloc()

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

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

  

“如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但不应使用返回的指针访问一个对象。“ C11dr§7.22.3.11

更便携的解决方案:

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,然后不需要这个额外的检查。