首页 文章

大数组大小的分段错误

提问于
浏览
94

以下代码在2Gb机器上运行时给出了分段错误,但在4GB机器上运行 .

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

阵列的大小只有4Mb . 可以在c中使用的数组大小是否有限制?

5 回答

  • 49

    你可能只是在这里得到一个堆栈溢出 . 该数组太大,无法放入程序的堆栈地址空间 .

    如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存 .

    int* array = new int[1000000];

    但请记住,这将需要你 delete[] 数组 . 更好的解决方案是使用 std::vector<int> 并将其大小调整为1000000个元素 .

  • 2

    在C或C中,本地对象通常在堆栈上分配 . 你正在堆栈上分配一个大数组,超过堆栈可以处理的数组,所以你得到一个stackoverflow.

    不要在堆栈上分配本地,而是使用其他地方 . 这可以通过使对象全局化或在全局堆上分配它来实现 . 全局变量很好,如果你不偶然发生,添加一个静态存储说明符,否则只需使用堆 .

    这将在BSS段中分配,这是堆的一部分:

    static int c[1000000];
    int main()
    {
       cout << "done\n";
       return 0;
    }
    

    这将在DATA段中分配,这也是堆的一部分:

    int c[1000000] = {};
    int main()
    {
       cout << "done\n";
       return 0;
    }
    

    这将在堆中的某个未指定位置分配:

    int main()
    {
       int* c = new int[1000000];
       cout << "done\n";
       return 0;
    }
    
  • 105

    此外,如果您在大多数UNIX和Linux系统中运行,则可以通过以下命令临时增加堆栈大小:

    ulimit -s unlimited
    

    但要小心,记忆是一种有限的资源,并且有很大的力量来承担很大的责任:)

  • 2

    在这种情况下,您正在堆栈上分配数组,尝试使用alloc分配相同大小的数组 .

  • 9

    因为您将数组存储在堆栈中 . 您应该将它存储在堆中 . 请参阅this link以了解堆和堆栈的概念 .

相关问题