0
#include<stdio.h>
#include<conio.h>
#define DATA_SIZE 65000


int main()
{
     int a[DATA_SIZE],b[DATA_SIZE],c[DATA_SIZE],d[DATA_SIZE];
     for(int i=0;i<DATA_SIZE;i++)
     {
         a[i]=i;
         b[i]=i;
         c[i]=i;
      }
     for(int j=0;j<DATA_SIZE;j++)
     {
         d[i]=a[i]+b[i]+c[i];

     }
     return 0;
}

DATA_SIZEを 63000 を超えて増やすと、このプログラムでスタック オーバーフロー エラーが発生します。このプログラムで発生するのはなぜですか?

i変数の値を2000 万以上使用したい場合、どうすればこれを達成できますか?

ありがとう

4

3 に答える 3

3

おそらく、これらの巨大なサイズの配列をローカルで作成しているため、スタックスペースが限られているため不足しています。

いくつかのオプションから選択できます。

  • std::vectorまたはを使用する
  • それらをグローバルまたは静的またはとして宣言します
  • とを使用して動的メモリ割り当てを使用newdeleteます。

最後のオプションを使用する場合は、生のポインターではなく、スマート ポインターを介して RAII を使用していることを確認してください。

于 2013-02-09T05:46:36.643 に答える
1

An のintサイズは、ほとんどのシステムで 4 バイトです。4 つの配列はそれぞれ 65000int要素であり、65000 * sizeof(int) = 260000バイトを使用します。合計すると、4 つの配列は合計260000 * 4 = 1040000バイト数のスタック スペースを使用しています。これは、多くのリンカーで使用される 1MB の既定のスタック サイズに危険なほど近い値です (既定のスタック サイズはプロジェクト構成で変更できます)。そのため、配列のサイズを増やそうとするとオーバーフローが発生します。実際、リンク時に構成されたスタック サイズを超えています。

大量のメモリを使用する場合は、スタックの代わりにヒープを使用します。

#include <stdio.h>
#include <conio.h>
#define DATA_SIZE 65000

int main()
{
     int *a = new int[DATA_SIZE];
     int *b = new int[DATA_SIZE];
     int *c = new int[DATA_SIZE];
     int *d = new int[DATA_SIZE];

     for(int i=0;i<DATA_SIZE;i++)
     {
         a[i]=i;
         b[i]=i;
         c[i]=i;
     }

     for(int j=0;j<DATA_SIZE;j++)
     {
         d[i]=a[i]+b[i]+c[i];
     }

     delete[] a;
     delete[] b;
     delete[] c;
     delete[] d;

     return 0;
}

std::vectorクラスを使用してヒープメモリを管理するように変更できます。

#include <stdio.h>
#include <conio.h>
#include <vector>
#define DATA_SIZE 65000

int main()
{
     std::vector<int> a(DATA_SIZE);
     std::vector<int> b(DATA_SIZE);
     std::vector<int> c(DATA_SIZE);
     std::vector<int> d(DATA_SIZE);

     for(int i=0;i<DATA_SIZE;i++)
     {
         a[i]=i;
         b[i]=i;
         c[i]=i;
     }

     for(int j=0;j<DATA_SIZE;j++)
     {
         d[i]=a[i]+b[i]+c[i];
     }

     return 0;
}
于 2013-02-10T06:27:55.090 に答える
0

コールスタックにあまりにも多くの変数を割り当てているようです。そのような巨大な配列を使用する場合は、ヒープに割り当てることをお勧めします。

ポインターを使用してこれを行うことができます。

于 2013-02-09T05:52:06.680 に答える