静的配列よりも malloc を使用する利点は何ですか?(失敗時に NULL を返す以外に)? 次のプログラムは、ループがコメント解除されている場合にのみ、すべての RAM を使い果たし、スワップの充填を開始します。クラッシュしません。
...
#include <stdio.h>
unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];
int main (int argc, char **argv) {
int i;
/* for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/* for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */
getchar();
return 0;
}
...
いくつかの試行錯誤の後、上記が GCC 4.3 を搭載した 32 ビット Intel マシンで許可されている最大の静的配列であることがわかりました。これは標準の制限ですか、コンパイラの制限ですか、それともマシンの制限ですか? どうやら、私はそれらを好きなだけ持つことができます。それはセグメンテーション違反になりますが、とにかくmallocが私に与えるよりも多くを求めた(そして使用しようとした)場合に限ります。
静的配列が実際に割り当てられ、安全に使用できるかどうかを判断する方法はありますか?
編集: 仮想メモリ システムにヒープを処理させるのではなく、malloc を使用してヒープを管理する理由に興味があります。どうやら、配列のサイズを必要と思われるサイズの何倍にもすることができ、仮想メモリシステムは必要なものだけをRAMに保持します。たとえば、これらの巨大な配列の末尾 (または先頭) に書き込みを行わない場合、プログラムは物理メモリを使用しません。さらに、すべての場所に書き込むことができる場合、ヒープ内のポインターをインクリメントしたり、同じプロセスで以前の割り当てを検索したりする以外に、malloc は何をしますか?
編集者注: int が 32 ビットの場合1 << 31
、未定義の動作が発生1u
するため、質問を read に変更しました。質問の意図は、大きな静的バッファの割り当てについて尋ねることです。