0

私のVC++CPPUNITプロジェクトでは、単体テストの次のコードにより、スタックオーバーフロー例外が発生します。

const int n = 1000000;
const char *test[n];

Utilities_Tests.exeの0x00AD89E7での初回例外:0xC00000FD:スタックオーバーフロー(パラメーター:0x00000000、0x00132000)。Utilities_Tests.exeの0x00AD89E7で未処理の例外:0xC00000FD:スタックオーバーフロー(パラメーター:0x00000000、0x00132000)。

しかし、これはしません:

const int n = 1000000;
char test[n];

スタックオーバーフローはコードが実行される前に発生するため、単体テストの先頭にあるブレークポイントはヒットしません。なぜこれが起こるのか考えていますか?回避策はありますが、何が起こっているのか知りたいだけです。

4

3 に答える 3

4

Acharは1バイト、achar*はおそらく4バイトです(これより多くても少なくてもかまいません)。

したがって、最初のケースでは、スタックにより多くのメモリ(約4倍)を割り当てようとします。スタックメモリには制限があります。1000000スタック上のプラットフォームにバイトが収まるだけですが、収まり4 * 1000000ません。

于 2013-03-08T09:31:34.793 に答える
3

32ビットコンピューターでは、ポインターは4バイトであるため、100万ポインターは400万バイトです(64ビットマシンでは、ポインターのサイズは64ビットであるため、アレイの場合は800万バイトです)。スタックは通常1〜4メガバイトの範囲であるため、char配列(100万バイト)はスタックに収まりますが、ポインター配列は収まりません。

于 2013-03-08T09:32:02.767 に答える
0

これは、スタックスペースが不足しているために発生します。スタックスペースは、スレッドごとの有限のリソースです。ネストされた関数呼び出しを行い、ローカル変数を使用すると、それが消費されます。不足すると、スタックオーバーフローが発生します。

最初の例では、100万char*を割り当てます。これは通常、4MBまたは8MBのメモリになります。2番目の例では、1MBのみを割り当てます。割り当てられたスタックスペースの一般的なサイズも約1MBであるため、結果はまったく驚くべきものではありません。

考えられる解決策については、ここまたはここを参照してください。

于 2013-03-08T09:31:56.163 に答える