配列のアロケーション
大きい配列を作ろうとすると、セグメントフォルトがおこりました。
#includeint main(void) { int a[100000000]; // something return 0; }
$ g++ test.cpp && ./a.out [1] 8431 segmentation fault ./a.out
配列をグローバル変数にするとセグメントフォルトはおこりませんでした。
#includeint a[100000000]; int main(void) { // something return 0; }
原因はグローバル変数とローカル変数のメモリ確保先でした。
C言語のメモリには、コード、データ、ヒープ、スタックの4種類があります。グローバル変数はデータ領域に、ローカル変数はスタック領域に確保されます。おそらくスタック領域のほうが小さいため、セグメントフォルトがおこったものと考えられます。
ただ、スタック領域の大きさはどうやって調べるのか、一般的な環境ではどのくらいの大きさまでの配列を使用できるのかなど、まだわからない点があります。調べたいのですが、いまいちうまくアプローチできません。こういうCの内部的な動作は、どういうキーワードで調べるのが良いんですかね。コンパイラ、OS、UNIXあたりかなと思うのですが。うーん。