C 声明大型数组时获取堆栈溢出异常

C 声明大型数组时获取堆栈溢出异常,c,arrays,memory,stack,allocation,C,Arrays,Memory,Stack,Allocation,以下代码正在为我生成堆栈溢出错误 int main(int argc, char* argv[]) { int sieve[2000000]; return 0; } 我该怎么做?我使用Turbo C++,但是希望把我的代码保存在c中 编辑: 谢谢你的建议。上面的代码只是一个例子,我实际上是在函数中声明数组,而不是在sub-main中声明数组。另外,我需要将数组初始化为零,所以当我在谷歌上搜索malloc时,我发现calloc非常适合我的用途 MaloC/CaloC也有比在栈

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

int main(int argc, char* argv[])
{
    int sieve[2000000];
    return 0;
}
我该怎么做?我使用Turbo C++,但是希望把我的代码保存在c

中 编辑:

谢谢你的建议。上面的代码只是一个例子,我实际上是在函数中声明数组,而不是在sub-main中声明数组。另外,我需要将数组初始化为零,所以当我在谷歌上搜索malloc时,我发现calloc非常适合我的用途


MaloC/CaloC也有比在栈上分配的优势,允许我用变量声明大小。

您的数组太大,无法适应堆栈,请考虑使用堆:

int *sieve = malloc(2000000 * sizeof(*sieve));
如果确实要更改堆栈大小


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

你的数组太大,无法适应堆栈,考虑使用堆:

int *sieve = malloc(2000000 * sizeof(*sieve));
如果确实要更改堆栈大小


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

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

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

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

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

这大约是7MB的堆栈空间。在visual studio中,您可以使用/STACK:########来反映所需的大小。如果您真的想要一个巨大的堆栈(这可能是一个很好的理由,使用LISP或其他语言:),即使堆在强制使用VirtualAlloc之前仅限于小的“sh”分配),您也可能希望将PE设置为使用/LargeAddressAware(再次使用Visual Studio的链接器)构建,但这是您的PE头,允许您编译的二进制文件寻址整个4GB的32位地址空间(如果在WOW64中运行)。如果构建真正庞大的二进制文件,通常还需要将/bigobj配置为附加的链接器参数


如果您仍然需要更多的空间,您可以通过使用simular to(同样是MSVC的link)/merge:,从根本上违反约定,这将允许您将一个部分打包到另一个部分,这样您就可以将每个字节用于单个共享代码/数据部分。当然,您还需要在def文件中或使用大约7MB的堆栈空间的#pgrama配置节权限。在visual studio中,您可以使用/STACK:########来反映所需的大小。如果您真的想要一个巨大的堆栈(这可能是一个很好的理由,使用LISP或其他语言:),即使堆在强制使用VirtualAlloc之前仅限于小的“sh”分配),您也可能希望将PE设置为使用/LargeAddressAware(再次使用Visual Studio的链接器)构建,但这是您的PE头,允许您编译的二进制文件寻址整个4GB的32位地址空间(如果在WOW64中运行)。如果构建真正庞大的二进制文件,通常还需要将/bigobj配置为附加的链接器参数

如果您仍然需要更多的空间,您可以通过使用simular to(同样是MSVC的link)/merge:,从根本上违反约定,这将允许您将一个部分打包到另一个部分,这样您就可以将每个字节用于单个共享代码/数据部分。当然,您还需要在def文件或#pgrama中配置节权限。

有3种方法:

  • 在堆上分配数组-如其他海报所建议的,使用
    malloc()
    。不要忘记
    free()
    it(尽管对于
    main()
    来说,这并不重要-操作系统会在程序终止时为您清理内存)
  • 在单元级声明数组-它将在数据段中分配并对每个人可见(向声明中添加
    static
    将限制单元的可见性)
  • 将数组声明为
    static
    ——在这种情况下,它将在数据段中分配,但仅在
    main()
    中可见
  • 有三种方法:

  • 在堆上分配数组-如其他海报所建议的,使用
    malloc()
    。不要忘记
    free()
    it(尽管对于
    main()
    来说,这并不重要-操作系统会在程序终止时为您清理内存)
  • 在单元级声明数组-它将在数据段中分配并对每个人可见(向声明中添加
    static
    将限制单元的可见性)
  • 将数组声明为
    static
    ——在这种情况下,它将在数据段中分配,但仅在
    main()
    中可见

  • 有什么原因不能使用alloca()根据对象实际需要的大小在堆栈帧上分配所需的空间

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

    如果它真的要那么大,而你的程序不能在堆上分配它,那么你的程序一开始就不需要在那种类型的机器上运行


    (确切地说)你想完成什么?

    有什么原因不能使用alloca()根据对象实际需要的大小在堆栈帧上分配所需的空间

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

    如果它真的要那么大,而你的程序不能在堆上分配它,那么你的程序一开始就不需要在那种类型的机器上运行


    你到底想完成什么?

    使用malloc。所有检查返回类型是否为非空,如果为空,则系统没有足够的内存来容纳这么多的值。

    使用malloc。所有检查返回类型是否为非空,如果为空,则您的系统没有足够的内存来容纳这么多的值。

    您的数组太大了

    您的计算机或操作系统可能没有ha