私は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
またサイズ>= 17GB
のmalloc
に単一の呼び出しが失敗しているが、16GB
に複数のコールを渡しています。私のシステムのRAMサイズはあなたがmemory overcommitmentを無効にすることができます正確にどのように単一/複数の呼び出し
'else'は' if(g == NULL) 'チェックにのみ属し、他のものには属しません。 –
システムがどのようなシステムであるかを教えてくれれば、あなたのシステム上の特定の 'malloc'実装がそれらのことをどのようにして行うのか話すかもしれません。 C言語の仕様は、それ自体が問題に話すことはありません。 –
あなたの問題については、あなたのRAMサイズは64GBだと言いますが、それは*物理的なメモリサイズか*仮想*メモリサイズですか? –