2012-02-28 2 views
0

2GBのRAMを搭載したVisual C++を使用するWindows XPでは、スタックオーバーフローを作成するために同時にいくつの関数をスタックに置く必要がありますか? (つまり再帰関数で)スタックオーバーフローを作成する関数はいくつありますか?

他の同様の状況でこれを計算する簡単な方法はありますか?

+0

スタックはデフォルトでメガバイトです。可能な最小のスタックフレームは、最適化されたビルドでは4バイトです。実用的なものははるかに大きいです。 RAMはそれとは関係ありません。 –

+1

ただ1回の関数呼び出しでスタックをオーバーフローさせることができます。 – mah

答えて

3

コンパイラからは分かりません。スタックオーバーフローは、スタックのオーバーフローのために発生します。スタックのサイズは、関数がとる引数、関数が使用するローカル変数、およびコンパイラの最適化によって大きくなります。スタックから直接スペースを割り当てるC99関数もあります。

スタックのサイズの制限は、コンパイラスイッチによって決まります。コンピュータに搭載されているRAMの容量ではありません。オーバーフローするために必要な呼び出しの数は、メモリよりもコンパイラの設定に関係します。

これは、先験的に判断できるものではありません。少なくとも、些細なことではない。

+1

実際には、PEオプションヘッダー(オフセット72)のSizeOfStackCommitフィールドを調べることによって、ランタイム時のイメージのスタック制限を判断できます。ハンス氏によると、通常は0x10000(1MB)です。 –

0

無限再帰を試すことができます。これは、スタックオーバーフローの一般的な原因の1つです。

int f() { g(); } int g() { f(); }

+0

これは質問に答えません。 - さらに、私はスタックオーバーフローが5秒以内に発生すると予想していましたが、代わりにタイムアウトしました:http://ideone.com/QoWtS;) – visitor

関連する問題