每个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))
<error>
答案 0 :(得分:12)
这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为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)
然后允许您运行以下函数:
if(-1 == foo()) PrintDie("Oh no");
这为您提供了一个班轮,在启用适当检查的同时又避免了批量生产。
答案 1 :(得分:4)
无需投射malloc()
。是的,需要检查malloc()是否成功。
假设malloc()
失败并且您正在尝试访问指针,认为内存已分配将导致崩溃。因此,最好在访问指针之前捕获内存分配失败。
int *arr = malloc(sizeof(*arr));
if(arr == NULL)
{
printf("Memory allocation failed");
return;
}