2011-12-05 11 views
2

私のような、単純な例でスタックオーバーフローエラーを取得する方法を思ったんだけど:私はいくつかセグメンテーションフォールトを持っているので、私は自分自身を呼び出しても、空の関数で、その愚かな質問をC++およびUnixでスタックオーバーフローを取得するにはどうすればよいですか?

int recursSum (int n) 
{ 
    return (n==1)? 1:n+recursSum(n-1); 
} 

...

何かが見つからないか、または保護またはこれを行うために私を防ぐ何かがありますか?

+0

関連:http://stackoverflow.com/questions/1657484/can-you-give-an-example-of-stack-overflow-in-c – Will

+2

このケースでは、_stack overflow_が原因となりますOS定義の_Segmentation fault_エラーが発生します。 – ninjalj

答えて

3

関数が負または0の整数引数で呼び出された場合、無限再帰に直面します。ただし、コンパイラはその特定の関数をテールコールで最適化できる可能性があり、デバッグモード以外ではスタックオーバーフローは発生しません。セグメンテーション違反は他の場所にあります。

+1

はい、スマートコンパイラが無限ループに最適化する可能性があります。しかし、OPが適切な-Oフラグを渡さなかったために、指定されたコードは、負の引数またはゼロ引数を指定して呼び出されたときにスタックオーバーフローを引き起こし、セグメンテーションフォルトが発生します。 OPも試してみた自身を呼び出す空の関数)。だから私は、セグメンテーション違反が他のどこかにあると思う理由は分かりません。 – sepp2k

3

スタックオーバーフローはセグメンテーションフォールトの一種です。システムが単に汎用エラーを出力したようです。あなたがここで多くを読むことができます

http://en.wikipedia.org/wiki/Segmentation_fault

6

をセグメンテーションフォールトは、メモリ保護を蹴ら、あなたが利用できる持っていなかったメモリへのアクセスからあなたを防ぐことを意味します。これはvariety of reasonsで発生する可能性がありますが、スタックオーバーフロー(メモリの他のセグメントへのスタックのオーバーフロー)が原因の1つが示されています。

0
Foo() 

{ 

    float f[1024]; 

    Foo(); 

} 

fは、スタックをすばやく埋めるのに役立つダミー変数です。

+3

何とか使用したい場合は、オプティマイザがその配列を完全に削除することがあります。 –

+0

この種の関数(と元の質問)では、コンパイラが最適化レベルなどに応じて再帰を排除するという妥当な可能性があります。 –

関連する問題