声明大型数组时发生堆栈溢出exception

以下代码为我生成堆栈溢出错误

int main(int argc, char* argv[]) { int sieve[2000000]; return 0; } 

我如何解决这个问题? 我正在使用Turbo C ++,但想保持我的代码在C中

编辑:

感谢您的build议。 上面的代码只是例如,我实际上声明在一个函数中的数组,而不是在主要的。 此外,我需要将数组初始化为零,所以当我使用malloc的时候,我发现calloc对我来说是完美的。

malloc / calloc也有优势,而不是在堆栈上分配,允许我使用variables声明大小。

你的数组太大,不适合堆栈,请考虑使用堆:

 int *sieve = malloc(2000000 * sizeof(*sieve)); 

如果你真的想改变堆栈的大小, 看看这个文件。

提示 : – 当不再需要时,不要忘记释放dynamic分配的内存。

有3种方法:

  1. 在堆上分配数组 – 使用malloc() ,如其他海报build议。 不要忘记free()它(尽pipe对于main()来说并不那么重要 – 操作系统将在程序终止时为你清理内存)。
  2. 在单元级别声明数组 – 它将被分配在数据段中,并且每个人都可见(向声明添加static将限制对单元的可见性)。
  3. 声明你的数组是static – 在这种情况下,它将被分配在数据段中,但仅在main()可见。
 int main(void) { int *sieve = xmalloc(2000000 * sizeof(int)); /* do stuff */ free(sieve); return 0; } 

你最好把它分配给堆,而不是堆栈。 就像是

 int main(int argc, char* argv[]) { int * sieve; sieve = malloc(20000); return 0; } 

这大约有7MB的堆栈空间。 在visual studio中,您可以使用/ STACK:###,###来反映您想要的大小。 如果你真的想要一个巨大的堆栈(可能是一个很好的理由,使用LISP或其他东西:),甚至在强制你使用VirtualAlloc之前,堆只限于small'sh分配),你可能还想设置你的PE / LARGEADDRESSAAWARE(Visual Studio的链接器),但是这个configuration的PE头允许你编译的二进制文件寻址完整的32位地址空间(如果在WOW64中运行的话)。 如果构build真正大规模的二进制文件,通常还需要将/ bigobjconfiguration为附加的链接器参数。

如果你仍然需要更多的空间,你可以通过使用类似于MSVC的链接/合并的方式从根本上违反约定,这将允许你打包一个部分到另一个部分,所以你可以使用每个单独的字节为一个共享的代码/数据部分。 当然,你也需要在def文件或#pgrama中configurationSECTIONS权限。

使用malloc。 所有检查返回types是不是null,如果它是null,那么你的系统根本没有足够的内存来适应这么多的值。

有什么理由不能使用alloca()根据对象真正需要的大小来分配堆栈帧所需的空间吗?

如果你这样做,并且仍然不能使用,那就把它放在分配的堆中。 我强烈build议不要在main()中将其声明为静态并将其放入数据段中。

如果真的必须是那么大,你的程序不能在堆上分配,那么你的程序真的没有业务运行在这种types的机器开始。

你究竟想要完成什么?

你的arrays是巨大的。

您的机器或操作系统可能没有或不想分配太多的内存。


如果你绝对需要一个巨大的数组,你可以尝试dynamic分配它(使用malloc(...) ),但是那么你有可能泄漏内存。 不要忘记释放内存。

malloc的好处是它试图在堆上分配内存而不是堆栈(因此你不会得到堆栈溢出)。

您可以检查malloc返回的值,看看分配是成功还是失败。 如果失败,只要尝试malloc一个较小的数组。


另一个select是使用可以在运行中resize的不同数据结构(如链接列表)。 这个选项不错,取决于你将要对数据做什么。

还有另一种select是将文件存储在文件中,即时传输数据。 这种方法是最慢的。

如果你在硬盘上存储,你可以使用现有的库(用于数据库)

由于Turbo C / C ++是16位编译器,因此int数据types消耗大约2个字节。 2字节* 2000000 = 40,00,000字节= 3.8147MB空间。

函数的自动variables存储在堆栈中,导致堆栈内存溢出。 根据处理器内存映射的可用性,使用数据存储器[使用静态或全局variables]或dynamic堆内存[使用malloc / calloc]来创build所需的内存。

应该有一个选项来设置堆栈大小。

改用malloc代替。 句法:

 newnode=(struct node *)malloc(sizeof(struct node))