2011-02-02 7 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; 
} 

私は、WindowsとLinuxの両方をインストールした状態で64ビットシステムを使用しています。したがって、私は64ビットシステム上の答えとしてちょうど1ギガビットを得ていますが、上記のロジックは正しいですか?

+0

。 o/sによって設定された制限に依存する可能性がありますが、これは適切な特権ユーザーによって調整される可能性があります。 1023 * 1024 * 1024 * 2を割り当てようとしましたか? –

+4

intが符号付き32ビット変数の場合、このコードは整数オーバーフローに悩まされる危険があると思います。定数をunsigned longにしてみてください(または、コンパイラにそれがある場合はunsigned long longとしてください)。 – unwind

+0

@unwindそれは私のために働いた。私はそれを止める前に500GBを超えることができました。 (Mac OS Xは特定のサイズを超えて 'mmap()'を使用しています。)あなたのコメントを答えて投票できるようにします。 – chrisaycock

答えて

3

32ビットOSの場合、連続する最大ブロックが1GB(またはそれと2GBの間のどこか)であることは驚くことではありません。 64ビットOSでは、より大きなブロックが可能です。

コードを変更してより小さい個体を割り当てると、合計で1GB以上を割り当てることができます。

+1

時には、32ビットシステムで約3,3.5GBまで取得することができます。もちろん、4GBは厳しい制限です。 *それよりも小さい値です*。 –

+0

@Jonathan:私は自分の答えに数字をつけて、彼がどのプラットフォームを使っているのか分からなかったので、それをよく考えました。加えて、考慮すべきフラグメンテーションなどの他の問題もあります。 1MBのブロックをループに割り当てることは、少なくとも私の経験では、ほとんどの現実世界のアプリケーションと比べて最大を「過大に」過ぎるでしょう。 –

+0

@Jonathan:32ビットOSで2GB以上の連続した割り当てが可能で、しかも32ビットの 'ptrdiff_t'を持っている場合、それは** broken **と** nonconformant **です。ポインタの違いは非常に危険です!)。 –

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; 
} 
+1

これは何を表示するはずですか? mallocがエラーなしに戻ることができるが、あなたが実際に持っているよりも多くのスペースを割り当てることができます。 「メモリオーバーコミット」を見てください – Falmarri

関連する問題