gpt4 book ai didi

c - Malloc 不返回 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:52 25 4
gpt4 key购买 nike

我刚刚用一个巨大的内存请求测试了 malloc,它没有返回 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.

我如何才能正确可靠地检查返回的指针是否指向请求大小的有效 block ?

编辑:我刚看到 this邮政。我猜 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

malloc 返回NULL。您可能有不同版本的工具和运行时库。

关于c - Malloc 不返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com