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

Pat*_*ald 39 c memory arrays stack allocation

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

int main(int argc, char* argv[])
{
    int sieve[2000000];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

aru*_*rul 55

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

int *sieve = malloc(2000000 * sizeof(*sieve));
Run Code Online (Sandbox Code Playgroud)

如果您真的想要更改堆栈大小,请查看此文档.

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

  • 因为这是C,你不需要(事实上,不应该)强制转换malloc的返回值. (19认同)
  • @ yodaj007:你不需要明确地转换它.由于赋值的变量也是指针类型,因此赋值执行隐式转换. (5认同)
  • @Amy阅读本文:["我是否施放了'malloc`的结果?'"(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc?s = 1 | 8.2768).它解释了为什么*不*在C中强制转换`malloc`(或任何其他内存分配函数)的几个原因. (2认同)

qrd*_*rdl 12

有3种方式:

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