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超过 20 万的变量值,我该如何实现呢?

谢谢

4

3 回答 3

3

您可能正在本地创建那些巨大的数组,因此由于堆栈空间有限,因此会耗尽堆栈空间。

有几个选项可供选择:

  • 使用std::vector
  • 将它们声明为全局或静态或
  • 使用new和使用动态内存分配delete

如果您使用最后一个选项,请确保您通过智能指针而不是原始指针使用 RAII。

于 2013-02-09T05:46:36.643 回答
1

在大多数系统上, Anint的大小为 4 个字节。四个数组中的每一个都是 65000 个int元素,因此使用65000 * sizeof(int) = 260000字节。这四个数组总共使用了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 回答