2014-01-15 45 views
1

无法在64位Linux机器,我写了下面的小C程序:分配的超过2GB的64位二进制

#include <stdlib.h> 
#include <stdio.h> 

int main (void) 
{ 
    #define BLOCK_SIZE (1024*1024) 
    int i; 

    for (i = 1; ; i++) 
    { 
     char *p = (char *)malloc(i * BLOCK_SIZE); 
     if (p == 0) 
      break; 
     *p = 13; 
     free(p); 
    } 

    printf ("Allocated max %d MB\n", (i - 1)); 

    return 0; 
} 

如果我编译这个与-O0 -m64,我可以在我的桌面系统上分配2047 MB 。如果我编译与-O0 -m32 3829 MB相同的程序。

为什么在同一台机器上,32位二进制的最大malloc大小大于64位二进制大小?

编辑:如果我用-O3激活优化器,64位机器上的最大内存量为20588。

+1

您是否曾尝试过这种方式,或者结果与您的程序的多个(如数十甚至数百)运行一致?此外,当您在启动后直接运行程序的结果与您的计算机运行几小时甚至几天后的结果相似吗? –

回答

10

您正试图在有符号的32位int中存储大于2^31的数字。它不适合。请使用size_t代替您传递给malloc的尺寸。将i的类型更改为size_t

+0

有了这个修正,我能够分配32274兆字节(Debian/Sid/x86-64,16GB内存,16GB swap) –

+0

好的。我不认为这是愚蠢的。 – urzeit

相关问题