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;
}