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 -Wall
或 clang -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
returnsNULL
。您可能有不同版本的工具和运行时库。
我刚刚用巨大的内存请求测试了 malloc
,但没有 return NULL
。我已经听说过这个但是 BSD(我在 mac)man-page 说:
RETURN VALUES
If successful,calloc()
,malloc()
,realloc()
,reallocf()
, andvalloc()
functions return a pointer to allocated memory. If there is an error, they return aNULL
pointer and set errno toENOMEM
.
如何正确可靠地检查 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 -Wall
或 clang -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
returnsNULL
。您可能有不同版本的工具和运行时库。