2014-01-15 47 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

相關問題