たとえば、私はできる
int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);
しかし、プログラムがクラッシュせずにこれを行うことはできません:
int arr[1048575];
これはなぜですか?
たとえば、私はできる
int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);
しかし、プログラムがクラッシュせずにこれを行うことはできません:
int arr[1048575];
これはなぜですか?
arr
がローカル変数であると仮定すると、それを配列として宣言すると、(比較的制限された) スタックからのメモリが使用され、(比較的制限のないmalloc()
) ヒープからのメモリが使用されます。
これらを関数内のローカル変数として割り当てている場合 (ポインター宣言の直後にmalloc
呼び出しを行うことができる唯一の場所です)、違いはmalloc
、ヒープからメモリのチャンクを割り当て、そのアドレスを提供することです。直接実行int arr[1048575];
すると、スタックにメモリを割り当てようとします。スタックに使用できるスペースがはるかに少なくなります。
スタックのサイズは、私が認識している 2 つの主な理由で制限されています。
配列を宣言すると、スタックに配置されます。
malloc() を呼び出すと、メモリがヒープから取得されます。
通常、スタックはヒープに比べてより制限されており、通常は一時的です (ただし、この配列が宣言されている関数に出入りする頻度によって異なります。
このような大規模な (おそらく今日の標準ではありませんか?) メモリの場合は、配列をしばらく存続させたいと仮定して、メモリを malloc することをお勧めします。