プログラムがSegmentation faultと出力されて異常終了する原因は何ですか?

C/C++等でプログラムを作成している場合に良くある原因として、メモリの使い方に関してバグがある場合です。参照してはいけない領域(mallocで確保した領域の外など)を参照してしまってる場合に発生します。解決方法としてはまずvalgrindというツールでメモリアクセスに関してチェックすることをおすすめします。以下に手順を簡単に説明します。

1. プログラムの再コンパイル
プログラムのコンパイルオプションとして最適化オプションを外し、デバッグオプションを有効にして再コンパイルします。インテルコンパイラの場合は、

icc -g -O0 test.c -o test

のように "-g -O0" をつけてください。"-O0" は最適化を無効にするオプションです。"-O3"などをつけていた場合はそのかわりに"-O0"としてください。gccの場合も同様に、

gcc -g -O0 test.c -o test

のようにします。

2. valgrindによるチェック
上記のとおりコンパイルしたプログラムをvalgridを用いて以下のように実行します。

valgrind ./test その他引数

valgrindは与えられたプログラムをメモリエラーをチェックしながら実行します。実行時間は通常より長くなりますが、参照してはいけない領域への参照などを検出し表示してくれます。表示されたエラー箇所をすべて修正すればメモリアクセスのエラーをなくすことができます。

注意点としましては実行時間が通常より大幅に長くなりますので通常ではインタラクティブノードで実行できていたプログラムでも実行時間の制限により実行できなくなる場合があります。その場合は有料キューを用いてください。