2011-02-02 65 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; 
} 
相关问题