c-我应该检查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))
    <error>

这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为所有的错误检查都是针对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");

这给了你一个单一的班轮,再次避免散装,同时能够进行适当的检查。

无需强制转换malloc()。是的,但是需要检查malloc()是否成功。假设malloc()失败,并且您试图访问指针时认为内存已分配会导致崩溃,因此最好在访问指针之前发现内存分配失败。

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

相关内容

  • 没有找到相关文章

最新更新