C言語で関数を記述しましたが、呼び出されるとすぐにスタックのオーバーフローが発生します。C関数呼び出しのスタックオーバーフロー - MS Visual C++ 2010 Express
プロトタイプ: void dumpOutput(Settings *, char **, FILE *);
ライン呼び出し:それを呼び出す時に dumpOutput(stSettings, sInput, fpOut);
を、stSettings
は既にSettings
構造、sInput
へのポインタである動的に割り当てられた2次元アレイとfpOut
はFILE *
です。それは、エラーやメモリリークなどなく、呼び出し元の行まで届きます。
実際の関数はかなり時間がかかっています。ここでは、コードが関数に入ると同時にオーバーフローが発生します
私は渡された引数に問題があるかどうかをチェックするのにダミー変数を使ってmain()
から直接同じ関数を呼び出そうとしましたが、それでもスタックオーバーフロー条件がスローされました。
エラーは、関数が呼び出されたときにchkstk.asm
から発生します。このasmファイル(そこにあるコメントに従う)は、呼び出された関数のメモリをチェック/アロケートするためにスタックを調べようとします。スタックオーバーフローが発生するまで、ちょうどFind next lower page and probe
部分にジャンプし続けます。
dumpOutput
のローカル変数は、メモリビーストではなく、ちょうど6つの整数と2つのポインタです。
この関数を入力する時点のコードで使用されるメモリは60,936Kで、スタックオーバーフローが発生した時点で61,940Kに増加します。このメモリの大部分はsInput
に入っています。これがエラーの原因ですか?ポインタだけが渡されているので、私はそうは思わない。第二に、なぜdumpOutput
がスタック上に1004Kのメモリを割り当てようとしているのか理解できないのですか?
私は完全にここに迷っています。どんな助力も高く評価されます。
ありがとうございます。
あなたはスタックオーバーフローのためにグーグルでこのサイトを見つけましたか? – CashCow
dumpOutput()はsInput配列のサイズをどのように知っていますか?ダンプするデータの最後にコードを終了できませんでしたか? FILEに書き込まれるたびに各バイトをフラッシュして、どのくらいのデータが書き込まれ、期待通りのものであるかを確認することができます。 – peterept
引数はすべてポインタであるため、スタック上の3 * 8(64ビットシステム上)バイト以上のメモリが必要です。関数の最初の数行を質問に追加できますか?そしておそらく引数の完全な宣言、そしてそれの前の実際の呼び出しといくつかの行? –