2017-11-12 19 views
-1

私はmalloc呼び出しで奇妙な問題に直面しています。私は巨大な配列(GBのサイズ)を使用して、配列を使用してメモリを割り当てようとしているプログラムで作業していますmalloc私はそれが私のRAM(64GB)よりも大きいサイズを割り当てても、mallocが成功しています。 。なぜ私のRAMよりも大きな配列を割り当てることができますか?

下記参照コード:

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


#define Sixteen_G 16000000000 

int main() { 
    int *c = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *d = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *e = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *f = (int *)malloc(sizeof(int)*Sixteen_G); 
    int *g = (int *)malloc(sizeof(int)*Sixteen_G); 
    if(c == NULL) 
      printf("c Allocation failed\n"); 
    if(d == NULL) 
      printf("d Allocation failed\n"); 
    if(e == NULL) 
      printf("e Allocation failed\n"); 
    if(f == NULL) 
      printf("e Allocation failed\n"); 
    if(g == NULL) 
      printf("e Allocation failed\n"); 
    else 
      printf("All arrays allocated\n"); 
    return 0; 
} 

上記コードの出力である:

All arrays allocated 

またサイズ>= 17GBmallocに単一の呼び出しが失敗しているが、16GBに複数のコールを渡しています。私のシステムのRAMサイズはあなたがmemory overcommitmentを無効にすることができます正確にどのように単一/複数の呼び出し

+0

'else'は' if(g == NULL) 'チェックにのみ属し、他のものには属しません。 –

+0

システムがどのようなシステムであるかを教えてくれれば、あなたのシステム上の特定の 'malloc'実装がそれらのことをどのようにして行うのか話すかもしれません。 C言語の仕様は、それ自体が問題に話すことはありません。 –

+0

あなたの問題については、あなたのRAMサイズは64GBだと言いますが、それは*物理的なメモリサイズか*仮想*メモリサイズですか? –

答えて

4

malloc作品もちょうど64ギガバイトで、ときにmallocは、その多くのメモリを割り当てることができる理由

誰かが説明することができます。

(私は実際にこの機能を嫌う)

this質問を参照してください。

コードはtest against malloc failureとする必要があります。

続きを読むvirtual address spaceを参照してください。 thisも参照してください。

+1

あなたの答えのおかげで、Linux上でのオーバーコミットについての素晴らしいページが見つかりました。同じ問題に直面するかもしれない他の人たちのために、ここで言及したかっただけです。 https://www.etalabs.net/overcommit.html – anirudh

関連する問題