2011-02-02 70 views
5

我用下面的代碼找出它,但總是得到1作爲答案。有什麼不對。謝謝malloc可以爲你的程序分配多少GB

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

int main(){ 
    int mult = 0; 
    int chk =8; 
    do{ 
     mult+=1; 
     int *p = (int*)malloc(1024*1024*1024*mult); 
     if(p==0){ 
      chk =0; 

     }else{ 
      free(p); 
     } 
    }while(chk !=0); 
    mult = mult -1; 
    printf("The number of gigs allocated is : %d\n",mult); 
    return 0; 
} 

只是爲了幫助,我有一個64位系統與Windows和Linux安裝。因此,即使我在64位系統上獲得1 GB的答案,上述邏輯是否正確?

+0

這取決於你的O/S。它可能取決於o/s設置的限制,可以由適當的特權用戶進行調整。你試過分配1023 * 1024 * 1024 * 2嗎? – 2011-02-02 16:16:52

+4

如果int是一個有符號的32位變量,我認爲這個代碼有被整數溢出的風險。嘗試使常量無符號長(或無符號長整型如果你的編譯器有它)。 – unwind 2011-02-02 16:20:37

+0

@unwind這對我很有幫助。在關閉它之前,我能夠超過500 GB。 (Mac OS X使用超過一定大小的`mmap()`)。給你的評論一個答案,以便我可以投票。 – chrisaycock 2011-02-02 16:29:00

回答

3

如果它是32位操作系統,那麼最大的連續塊將是1GB(或介於2GB和2GB之間)就不足爲奇了。在64位操作系統上,可能會有更大的塊。

如果您更改代碼以分配較小的單個部分,您可能會分配超過1GB的總計。

1
int main(void){ 
    int MB = 0; 
    while(malloc(1<<30)){ 
     ++MB; 
    } 
    printf("The number of gigs allocated is : %d\n",MB); 
    return EXIT_SUCCESS; 
} 
相關問題