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地址不会为空。
答案 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,然后不需要这个额外的检查。