0

この C++ コードを Windows コンソール アプリケーションとして実行しようとしましたが、起動するとすぐに終了し、Windows で通常表示される標準の「このプログラムは動作を停止しました」というエラーのみが表示されます。

プログラムの主な機能は次のとおりです (その後の余分なコードは省略されています)。

int main() {
    cout << "FIRST LINE";
    int fract[501][501];
    int rfract[501][501];
    int nufract[501][501];
    int nurfract[501][501];
    int snufract[501][501];
    int snurfract[501][501];
    system("PAUSE");
    return 0;
}

興味深いことに、最初の 2 つの配列しかない場合、プログラムは正常に実行されますが、他の 4 つの配列のいずれか (1 つだけでも) がある場合、プログラムは起動時にクラッシュします。4 GB の RAM を搭載したコンピューターを使用していますが、役立つエラー メッセージが表示されませんが、それが問題のようです。それらすべてのサイズを[101][101](〜1.2 MBから〜50kBに)変更すると、問題は解決しますが、関数を入力するスペースが少なくなります。これを回避する方法はありますか?

4

3 に答える 3

3

スタックのサイズは、ヒープのサイズよりもはるかに小さいです。ヒープに割り当てられたもの、newまたはmallocヒープに置かれたものはすべて、注意しないとスタックがすぐにいっぱいになってしまう可能性があります。

Web サイトを考えると、非常に多くの大きな配列でスタック オーバーフローが発生する可能性があります。

これを行うには、以下のコードを試してください。

#include <iostream>

int main(int argc, char* argv[])
{
int sarr2d[5][10];
typedef int dimension[10];
dimension* arr2d = new dimension[5];

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        sarr2d[i][j] = i*j;
    }
}

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        arr2d[i][j] = i*j;
    }
}

// print it out
for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        std::cout << arr2d[i][j] << " ";
    }
    std::cout << "\n";
}

delete [] arr2d;
return 0;
}

これは、ヒープ上の C++ 多次元配列という質問に触発されています。

于 2012-04-28T00:56:14.653 に答える
1

通常、スタック サイズはかなり小さいデフォルト サイズに制限されています。より大きなスタックが必要な場合は、通常、(システム固有の方法で) リンカーにそれを伝えることができます。

この特定のケースでは、変数を関数外の静的メモリ空間に割り当てることも選択できますmain。そのスペースは通常、スタックスペースよりもはるかに大きくなります。

int fract[501][501];
int rfract[501][501];
int nufract[501][501];
int nurfract[501][501];
int snufract[501][501];
int snurfract[501][501];

int main() {
    cout << "FIRST LINE";

    system("PAUSE");
    return 0;
}
于 2012-04-28T11:52:56.720 に答える
0

スタック上の項目が本当に必要な場合は、Microsoft コンパイラを使用している場合は /F スイッチを使用できます。または、プログラムをリンクするときにスタックのサイズを指定できる場合があります。おそらく/Fスイッチを使用します。ただし、これはヒープ領域を奪う可能性があります (スタックとヒープの両方の制限)。

スタック サイズの増加に関する MSDN のリンクは次のとおりです。

http://social.msdn.microsoft.com/Forums/da-DK/Vsexpressvc/thread/2a5b32b6-683b-4729-92d3-45ed7a89ef3f

于 2012-04-28T03:21:34.083 に答える