スタックオーバーフローエラーがいつ表示され、Cでループが無限に呼び出されるかについて混乱します!! どちらも同じですか、そうでない場合、両方のシナリオの違いは何ですか。助けてください。
5 に答える
終了しない関数を再帰的に呼び出すと、確実にスタック オーバーフローが発生します。しかし、すべてのスタック オーバーフローが基本ケースを持たない再帰呼び出しによって引き起こされるわけではありません。
たとえば、巨大なローカル配列にストレージを割り当てると、スタック オーバーフローが発生する可能性が非常に高くなります。
私のマシンでは、セグメンテーション違反で次のことが失敗します (割り当てがスタックのサイズを超えているため、プログラムに属していないメモリにアクセスしようとした可能性があります)。
#include <stdio.h>
int main()
{
int arr[1000 * 1000 * 100];
arr[99999999] = 0;
printf("%d\n", arr[99999999]);
return 0;
}
回復できないものの無限ループは、自動的にスタック オーバーフローを引き起こすことはありません (単にfor(;;) { int i = 1; }
これを単独で呼び出した場合は、スタック オーバーフローではありません)。
スタックオーバーフローは、メモリが計算を続行するのに十分でない場合に発生しますが、無限ループは、プログラムがループから飛び出さないループがあることを意味します。
別の関数を呼び出すときは、スタックを使用しています。そこに新しい関数のローカル変数と戻りアドレスを配置しています (一般的に言えば、これはアーキテクチャと実装に依存します)。これをやりすぎると、スタックが不足してオーバーフローします。
ループにとどまっているときは、スタックに追加していません。
c では、ループが停止しない場合、ループは無限と呼ばれます。スタックは別物です。スタック メモリは、データを一時的に格納するためにプロセッサによって使用されます。すべてのローカル変数、配列などはスタックに格納されることに注意してください。スタックにあまりにも多くの変数を格納している場合、その時点でスタックがオーバーフローしていると言われ、スタック メモリの容量を超えてしまうことがあります。無限ループが原因でスタックがオーバーフローすることもありますが、常にではありません。読む: http://en.wikipedia.org/wiki/Stack_overflow