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

gen*_*gen 7 c malloc error-handling runtime-error allocation

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

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

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

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

if(!(arr = (int) malloc(sizeof(int)*x*y))
    <error>
Run Code Online (Sandbox Code Playgroud)

Val*_*ity 14

这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

#define PrintDie(...) \
    do \
    { \
    fprintf(stderr, __VA_ARGS__); \
    abort(); \
    } while(0)
Run Code Online (Sandbox Code Playgroud)

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

if(-1 == foo()) PrintDie("Oh no");
Run Code Online (Sandbox Code Playgroud)

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

  • `if(NULL == AllocMem)` 是错误的测试。当“MemSize == 0”时,接收“malloc()”返回值“NULL”是符合行为的,而不是分配失败。更改为“if(NULL == AllocMem &amp;&amp; MemSize != 0)”可以解决此问题。 (4认同)
  • 你的“PrintDie”应该调用“abort”,而不是“exit”。因为调试起来会更简单(在 Linux 上,您甚至会得到一个“core”转储,您可以使用“gdb”进行事后分析) (3认同)

Gop*_*opi 5

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

int *arr = malloc(sizeof(*arr));
if(arr == NULL)
{
printf("Memory allocation failed");
return;
}
Run Code Online (Sandbox Code Playgroud)

  • 在一个时髦的笔记上,此答案提倡“检查malloc()是否成功”-这是一个好主意。但是然后,它显示了如何检查malloc(sizeof(int))而不是OP的malloc(sizeof(int)* x * y)的结果。对于此sizeof(int)进行针对NULL的测试就足够了,但对于OP的sizeof(int)* x * y而言是错误的。如果x * y`-&gt; 0,则返回NULL是兼容代码,并不表示内存分配。最好使用if(arr == NULL &amp;&amp; x!= 0 &amp;&amp; y!= 0)。 (4认同)