c - 使 malloc() 返回 NULL 而不是使程序崩溃?

标签 c macos crash memory-management malloc

我正在使用 malloc 在 C 程序中分配内存。我的程序有可能分配的内存多于系统的空间,此时程序崩溃。出于我的目的,如果 malloc 只返回 NULL(就像它显然是 supposed to )会更好,这样我就可以捕获错误。相反,它所做的是抛出一个错误,提示“现在没有可用于编程的内存:调用 malloc 是不安全的。”并使程序崩溃。

我该如何解决这个问题?

编辑:我知道程序本身崩溃了,而不是因为我试图引用一个空指针。该程序从不直接调用 malloc,而是调用我编写的调用 malloc 的函数,然后检查它是否返回 NULL。它从来没有说 malloc 返回了 NULL

编辑 2:如果有帮助,这里是完整的错误输出:

Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
warning: Unable to restore previously selected frame.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (dlopen) will be abandoned.)
No memory available to program now: unsafe to call malloc

最佳答案

一旦您通过缓冲区溢出、野指针或其他错误在堆上乱涂乱画,malloc 的行为就会变得不确定,它可能会返回任何东西。

Malloc 只是一个用户空间库;它里面没有任何魔法。如果我在您的应用程序的客户名称链接列表中到处涂鸦,您以后访问该列表时会出现奇怪的行为。 Malloc 的行为方式相同,但由于 malloc 的使用是通过代码分发的,因果关系具有全局影响。

所有的答案都围绕着这样一个事实,即指针错误是 C 代码中最普遍的缺陷来源。你很幸运,你得到了一个 SIGBUS,它是缺陷的证据,可能与故障发生的地点和时间相差甚远。使用 valgrind帮助您找到真正的缺陷所在。

关于c - 使 malloc() 返回 NULL 而不是使程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3518283/

相关文章:

c - 使用 Msp430fr5969 通过 Tx 发送字符串

ios - 使用 AVAssetWriter/AVAssetReader 设置视频帧率的问题

java - 不平凡的(看似)StringIndexOutOfBoundsException

listview - 带有 ComCtl32.ocx ListView 的 VB6 表单导致 Windows 8 上的应用程序崩溃

c - c程序的简单Makefile

c - Windows 操作系统中命名信号量的位置是什么

c - 如何使用 expat 找到流中 XML 文档的结尾?

javascript - 如何在 macOS 预览应用程序中使用 JavaScript for Automator (JXA) 保存图像?

objective-c - XCode版本可以在OSX 10.5.8上使用吗?

apache - 是什么导致 apache 崩溃并出现错误 "Inconsistency detected by ld.so"?