我应该检查malloc()是否成功?

如果成功,应该在每个malloc()之后检查吗? malloc()是否有可能失败? 那么会发生什么?

在学校我们被告知我们应该检查,即:

arr = (int) malloc(sizeof(int)*x*y); if(arr==NULL){ printf("Error. Allocation was unsuccessful. \n"); return 1; } 

有什么做法? 我可以这样做吗:

 if(!(arr = (int) malloc(sizeof(int)*x*y))  

无需malloc() 。 是的,需要检查malloc()是否成功。 假设malloc()失败并且您正在尝试访问指针,认为分配的内存将导致崩溃。因此,最好在访问指针之前捕获内存分配失败。

 int *arr = malloc(sizeof(int)); if(arr == NULL) { printf("Memory allocation failed"); return; } 

这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为malloc的所有错误检查。

就个人而言,我经常使用一个永远不会失败的小型malloc包装来解决这个问题。 除非你的软件是一个有弹性的,安全关键系统,否则无论如何都无法解决malloc失败的问题,所以我会建议这样的事情:

 static inline void *MallocOrDie(size_t MemSize) { void *AllocMem = malloc(MemSize); /* Some implementations return null on a 0 length alloc, * we may as well allow this as it increases compatibility * with very few side effects */ if(!AllocMem && MemSize) { printf("Could not allocate memory!"); exit(-1); } return AllocMem; } 

这将至少确保您收到错误消息并清除崩溃,并避免所有大量的错误检查代码。

对于可能失败的函数的更通用的解决方案,我也倾向于实现一个简单的宏,如下所示:

 #define PrintDie(...) \ do \ { \ fprintf(stderr, __VA_ARGS__); \ abort(); \ } while(0) 

然后,它允许您运行以下function:

 if(-1 == foo()) PrintDie("Oh no"); 

这为您提供了一个衬垫,再次避免了批量,同时启用了适当的检查。