为什么四个大于63000元素的本地数组会导致堆栈溢出

Why do four local arrays larger than 63000 elements result in a stack overflow?

本文关键字:数组 栈溢出 堆栈 元素 四个 63000 大于 为什么      更新时间:2023-10-16
#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万,我该如何实现?

感谢

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

有几个选项可供选择:

  • 使用std::vector
  • 将它们声明为全局或静态或
  • 使用newdelete进行动态内存分配

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

在大多数系统上,int的大小为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;
}

在我看来,您向调用堆栈分配的变量太多了。如果您打算拥有这样的巨大数组,我建议您将其分配到堆中。

你可以用指针来做到这一点。