声明大型数组时出现堆栈溢出异常

时间:2009-02-21 02:10:16

标签: c arrays memory stack allocation

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

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

我如何解决这个问题?我正在使用Turbo C ++,但希望将我的代码保存在C

编辑:

感谢您的建议。上面的代码只是例如,我实际上在函数中声明了数组而不是在sub main中。另外,我需要将数组初始化为零,所以当我使用Google搜索时,我发现calloc非常适合我的目的。

Malloc / calloc还具有优于堆栈分配的优势,允许我使用变量声明大小。

9 个答案:

答案 0 :(得分:52)

您的数组太大而无法放入堆栈,请考虑使用堆:

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

如果您真的想要更改堆栈大小,take a look at this document.

提示: - 不要忘记在不再需要时释放动态分配的内存。

答案 1 :(得分:12)

有三种方式:

  1. 在堆上分配数组 - 使用malloc(),正如其他海报所建议的那样。不要忘记free()它(虽然main()并不重要 - 操作系统会在程序终止时为你清理内存)。
  2. 在单元级别声明数组 - 它将在数据段中分配并且对每个人都可见(将static添加到声明将限制单元的可见性)。
  3. 将您的数组声明为static - 在这种情况下,它将在数据段中分配,但仅在main()中可见。

答案 2 :(得分:2)

最好在堆上分配它,而不是堆栈。

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

答案 3 :(得分:1)

这大约是7MB的堆栈空间。在visual studio中,您可以使用/ STACK:###,###来反映您想要的大小。如果你真的想要一个巨大的堆栈(可能是一个很好的理由,使用LISP或者其他东西:),即使堆只限于小的分配,然后强迫你使用VirtualAlloc),你可能还想设置你的PE来构建/ LARGEADDRESSAAWARE(Visual Studio的链接器再次),但是这个配置是你的PE头,允许你编译的二进制文件解决整个4GB的32位地址空间(如果在WOW64中运行)。如果构建真正大量的二进制文件,您通常还需要将/ bigobj配置为附加的链接器参数。

如果你仍然需要更多的空间,你可以通过使用类似的东西(再次MSVC的链接)/ merge:来彻底违反惯例,这将允许你将一个部分打包到另一个部分,所以你可以使用每个字节单个共享代码/数据部分。当然,您还需要在def文件或#pgrama。

中配置SECTIONS权限

答案 4 :(得分:1)

使用malloc。所有检查返回类型都不为null,如果它为null,那么你的系统根本就没有内存来适应那么多的值。

答案 5 :(得分:0)

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

如果你这样做,并且仍然破坏堆栈,请将其放入已分配的堆中。我强烈建议不要在main()中将其声明为静态并将其放入数据段中。

如果真的必须那么大并且你的程序无法在堆上分配它,那么你的程序真的没有业务在这种类型的机器上运行。

你想要完成什么(确切)?

答案 6 :(得分:0)

你的阵列很大。

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

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

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

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

另一个选择是使用可以动态调整大小的不同数据结构(如链接列表)。此选项很好取决于您将如何处理数据。

另一种选择是将内容存储在文件中,即时流式传输数据。这种方法是最慢的。

如果您要在硬盘驱动器上存储,您也可以使用现有的库(用于数据库)

答案 7 :(得分:0)

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

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

答案 8 :(得分:-2)

请改用malloc。语法:

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