【发布时间】:2015-08-11 16:55:34
【问题描述】:
在我的 C 程序中,我尝试使用 malloc() 函数分配一些内存,如下所示:
char *buf = (char *)malloc(size);
但问题是 malloc() 总是返回非 NULL 指针。即使我尝试分配大量(size 为 1E+13)内存,它也会返回有效的 buf 指针。当然是在那个程序崩溃之后。
但是,如果返回的 buf 值不为 NULL,我如何检测到请求的内存量太大且不可用?
编辑:
在 cmets 中,我看到我的问题可能不清楚。所以这是一个更扩展的示例:
unsigned long size = very_large_calculated_value;
char *buf = (char *)malloc(size);
if (buf == NULL) i_know_it_fails;
...
但 Xcode 运行此代码,并且 buf 永远不会为 NULL,无论请求的 size 是什么。所以,很快程序就会崩溃。如果 buf 不为 NULL,但显然无法使用,如何检测内存分配失败?
编辑:
致那些将问题标记为重复的人: “我如何检测内存分配失败?”这个问题没有答案,因为像“更改操作系统中的一些设置”这样的解决方案不是答案 - 我要求 C 代码检测内存分配错误,或者类似的东西“不可能以编程方式制作”。
【问题讨论】:
-
当你说“它返回有效的 buf 指针。当然在那个程序崩溃之后”是什么意思。您是否有表现出这种行为的代码?
-
标准警告:不要像
malloc和朋友返回的那样投射void *。 C 不是 C++! -
@Jashaszun a
void *可以在没有强制转换的情况下安全地分配给任何非函数指针或从任何非函数指针分配。 -
@Jashaszun:请阅读standard。这就是我添加最后一句话的原因。
-
@Jashaszun:只需搜索“C11 标准”或查看维基百科;他们链接这样的。一旦找到,我就为该网站添加了书签。在 SO 工作了几个月后,我想我现在很清楚在哪里可以找到相关部分。这个标准其实并不难理解。
标签: c xcode malloc dynamic-memory-allocation