Malloc 不 return NULL

Malloc doesn't return NULL

我刚刚用巨大的内存请求测试了 malloc,但没有 return NULL。我已经听说过这个但是 BSD(我在 mac)man-page 说:

RETURN VALUES
If successful, calloc(), malloc(), realloc(), reallocf(), and valloc() functions return a pointer to allocated memory. If there is an error, they return a NULL pointer and set errno to ENOMEM.

如何正确可靠地检查 returned 指针是否指向请求大小的有效块?

编辑: 我刚看到 this post。我猜 BSD 也一样?

编辑 2: 代码:

typedef struct {
    uint8_t red;
    uint8_t green;
    uint8_t blue;
} RGB_TYPE;

int main() {
    RGB_TYPE *field = malloc(50000 * 50000 * sizeof(RGB_TYPE));

    if (!field)
        return -1;

    ... write to field (SEG_FAULT) ... 

    return 0;
}

你的问题的原因有点棘手:

50000*50000*sizeof(RGB_TYPE) 计算为 (size_t)(50000 * 50000) * sizeof(RGB_TYPE)。乘法从左到右关联,因此第一次乘法是使用 int 算术和溢出,因为 2500000000 在您的平台上大于 INT_MAX

整数溢出会调用未定义的行为,您的平台 (clang) 可能会在这种情况下生成愚蠢的代码。如果指示(clang -Wallclang -Weverything),它可以生成诊断信息。在任何情况下,您的代码都会崩溃,因为该数组没有 预期的 大小。

将代码更改为

RGB_TYPE *field = malloc(sizeof(RGB_TYPE) * 50000 * 50000);

此外,在您的计算机上分配 7.5 GB 内存可能是可行的。这将取决于系统配置,但即使您只有 8GB RAM,OS/X 也并非不现实。

编辑: 在我的 Mac 上,您的代码确实不会产生带有 clang -Weverything 的警告,这是一个真正的麻烦,并试图分配18446744068324649728 字节。我从 malloc:

收到运行时警告
malloc-test(53877,0x7fff79dbe000) malloc: 
   *** mach_vm_map(size=18446744068324651008) failed (error code=3)
   *** error: can't allocate region
   *** set a breakpoint in malloc_error_break to debug

mallocreturnsNULL。您可能有不同版本的工具和运行时库。