无法在C中声明大小为400000的数组

我想做以下事情:

#include  #include  #define N 400000 void main() { int a[N]; } 

我得到一个stackoverflowexception。 我的电脑有6GB的主内存,所以我无法全部使用它。 我该如何解决这个问题? 我在Windows 7上使用VS 2008并在C中编码。

允许使用的堆栈大小永远不会是主内存的全部数量。

您可以使用此标志来设置堆栈大小 -默认为1MB。 要存储400,000个整数,您至少需要1.526 MB。

为什么不在堆而不是堆栈上分配它?

当您定义这样的变量时,您正在请求堆栈上的空间。 这是内存的托管部分,用于函数调用中的变量,但不用于存储大量数据。

相反,您需要在堆上手动分配内存。

 int *a = (int *) malloc(sizeof(int) * N); 

这将a定义为指向堆上内存的指针。 除了您需要手动操作外,它的行为与数组相同

 free(a); 

当你完成使用它或你将创建内存泄漏。

自动变量在堆栈上分配,通常为1MB。 要解决此问题,请在堆上分配内存:

 int *a = (int*)malloc(sizeof(int) * N); 

完成该内存后,可以解除分配:

 free(a); 

这将把内存返回给系统。

您需要堆栈大小大于400000 * 4 = 1600000字节~1.6 MB但Visual Studio中的默认堆栈大小为1MB。 有两种解决方案:

1-您可以通过以下方式更改程序的堆栈大小:

  • 右键单击项目,然后从菜单中选择属性。
  • 转到配置属性 – >链接器 – >命令行,添加此参数

    / STACK:2000000

在此处输入图像描述

2-动态数组分配在堆上,而不是静态数组,正如所有人所说的那样。