18 April 2009

配列のアロケーション

大きい配列を作ろうとすると、セグメントフォルトがおこりました。

#include 

int main(void)
{
  int a[100000000];

  // something

  return 0;
}
$ g++ test.cpp && ./a.out
[1]    8431 segmentation fault  ./a.out

配列をグローバル変数にするとセグメントフォルトはおこりませんでした。

#include 

int a[100000000];

int main(void)
{
  // something

  return 0;
}

原因はグローバル変数とローカル変数のメモリ確保先でした。

C言語のメモリには、コード、データ、ヒープ、スタックの4種類があります。グローバル変数はデータ領域に、ローカル変数はスタック領域に確保されます。おそらくスタック領域のほうが小さいため、セグメントフォルトがおこったものと考えられます。

ただ、スタック領域の大きさはどうやって調べるのか、一般的な環境ではどのくらいの大きさまでの配列を使用できるのかなど、まだわからない点があります。調べたいのですが、いまいちうまくアプローチできません。こういうCの内部的な動作は、どういうキーワードで調べるのが良いんですかね。コンパイラ、OS、UNIXあたりかなと思うのですが。うーん。