C らしい場所で嵌り中
2007/11/24
今日は、Cらしい嵌りのまっただなかです。メール送信の関数を呼び出すところで落ちるようになってしまいログ出したりしながら、確認してたのですが、非常に奇妙な落ち方をしていたので、困っていました。
内容は、メール送信を行なう関数の直前でログが出るんですが、メール送信関数の先頭のログが出ない。メール送信関数が見つからないのではないかとか、C を良く知らないなりにいろいろ調べていました。
メール送信自体はperlのスクリプトで行なうので、perlスクリプトに送信内容を渡す際、関数内で char content[VALUE_LENGTH]と、大きなバッファを宣言していたのが影響しているようです。自動変数(と言うんですかね)関数で使用するバッファを確保できない状態になって落ちているらしいというところまでわかりました。(多分、VALUE_LENGTHは1Mくらいってのが非常識なんでしょうね)
C を正しく理解していない人間にとって、この辺の嵌りはある意味新鮮に感じます。
「スタック ヒープ サイズ」で検索してきます。
追記20071125
http://www.cc.kyoto-su.ac.jp/~kbys/kiso-2005/cpu/mips3.html とかを参考にしました。
自動変数は、レジスタかスタックに確保され、mallocした領域はスタックに確保されるようです。
大きいバッファは、自動変数として確保するのではなく、mallocするようにしたら、上の現象は発生しなくなりました。でも相変わらず、理解度低すぎです。