第6回課題について のヒント

Q: 自分のPCで課題プログラムを動かすと segmentation fault (core dumped) となってしまうのですがどうしたらよいでしょうか?

A: 2次元配列を

    # define N 1024
    typedef int matrix_t[N][N];

    int main(void) {
      matrix_t M;
    (以下略)
のように宣言すると、M はスタック上に確保されます。 ところが Cygwin では、スタックサイズの上限が(特に指定しないと)2MB に なっているので、そのままでは 1024x1024x4 バイトの配列が確保できないのです。

一つの解決法は、配列用がスタック外にとられるようにすることです。 そのためには

  1. 配列宣言に、キーワード static を追加する
  2. 関数定義の { } の外側で配列を宣言する(この場合はキーワード static はつけなくてもよい)
のいずれかの方法が標準的でしょう。

なお、スタックサイズの上限は、Linux/Cygwin の bash を使っている場 合は ulimit -a コマンドで見ることができます。Linux ならば、ulimit -s によってスタックサイズを変更する方法もあるのですが、Cygwin の場 合は ulimit コマンドの -s オプションが使えません。かわりに、プログ ラムをコンパイルするときに gcc のオプションに

   -Wl,--stack,5000000
を指定すると(カンマの後にスペースを入れない)、スタックサイズを変 更することができます。(カンマの後に指定する数値の単位は kbytes で なくて bytes のようですが実験的に確認してください。) こうすれば、大きさ 4MB の配列をスタック上に確保できますが、4MB の 配列をスタック上にとった場合とスタック外にとった場合で性能が同じと は限りません(これはこれで実験の価値があります)。


Last update: December 19, 2007
ueda@ueda.info.waseda.ac.jp