チラシの裏からうっすら見える外枠の外のメモ書き

新聞に挟まってる硬い紙のチラシの裏からうっすら見える外枠の外に走り書きされたようなものです。思いついたときにふらふらと。

再帰関数でミスった話

最近全く更新していなかったので久々の更新

 

C言語であるプログラムを作成しているのですが、そこでちょっとしたトラブルに遭遇したのでその問題と解決方法を載せます。

作っているプログラムは次のとおり

mallocで構造体を作ってはつなげてリストを作る

・リストの中身はある関数で計算している

・ある関数は再帰関数になっている

 

ここでこのリストを5000件とかにするとメモリリークしてプログラムが終了しました。

Linux系だとSegmentation faultが発生します。

この問題は、関数が再帰関数であったことが原因でした。

 

 

ほとんどのプログラミング言語は、特定の関数やメソッドを呼び出すと、呼び出し元のPC*1局所変数などをスタック領域に退避させてジャンプするのですが、再帰関数の場合は再帰の回数が増えれば増えるほどスタック領域に退避されるデータ量が増えていきます。

そのことをすっかり忘れていた私はSegmentation faultを発生させて悩んでいました。

 

この原因がわかったのは、Windowsのイベントマネージャーでソフトウェア例外の例外コードを確認できたためです。

0xC00000FDが出ていればこのエラーだと思って間違いないと思います。

www.support.nec.co.jp

 

こういうことってプログラミング教室とかでも教えてくれるんですかね?ちょっと疑問です。

*1:プログラムカウンタ、実行している命令のアドレスを指す