C程序malloc赋值返回NULL的可能原因?

时间:2011-12-07 17:25:36

标签: c

我在64位Linux centos 5.7上使用gcc4.4.4和gdb,编译成ansi C.我不确定为什么我的代码在下面的PDF == NULL中测试为真,并调用exit(2)。

void func(...)
...
double *PDF;
...
PDF = malloc( sizeof(double) * 1 );
if (PDF == NULL) {
    exit(2); 
}

使用free -m,我在程序开始之前观察:

             total       used       free     shared    buffers     cached
Mem:          2001       1955         46          0         71        975
-/+ buffers/cache:        907       1094
Swap:         4008        688       3319

当程序坐在出口(2)上时;代码行,free -m读取:

             total       used       free     shared    buffers     cached
Mem:          2001       1970         31          0         72        976
-/+ buffers/cache:        921       1080
Swap:         4008        688       3319

在这两种情况下,缓存行中都有大量可用内存,空闲列(当然足够一个字节)。

PDF会变为NULL的其他可能原因是什么?什么编码错误可能会导致这种情况?

如果重要的话,我在上周一直在使用gdb,使用“q”然后“y”退出程序而不是让它完成(计算所有malloc内存将被程序终止因此释放不需要执行free()代码。)

2 个答案:

答案 0 :(得分:4)

如果你已经超出某个地方的缓冲区边界,你可能已经破坏了堆,在这种情况下所有的赌注都已关闭。

我建议使用例如Valgrind检查你没有做过这样的事情。

答案 1 :(得分:0)

当调用进程无法分配更多内存时,

malloc返回NULL,可能是因为mmap系统调用失败,因为您达到了某些限制,例如setrlimit

设置的限制

即使某些内存可用于其他进程,单个进程也可以达到其限制。

您可以使用strace跟踪系统调用并找出哪一个失败。

请务必使用gcc -Wall -g进行编译(并使用调试器gdb)。