2

我在 Ubuntu 中编写了一个 C++ 程序。在主函数中,我有这样的二维数组:

int main() {
   unsigned long long int s[11000][100];
   // some code to manipulate with s (just for initialization)
   // ...
}

并且程序无法运行。在网上搜索后,我知道二维数组的大小超过了 Ubuntu 中大约 8 MB 的默认堆栈大小。我尝试了一些建议在我的程序中自动更改堆栈大小。所以我添加了几行代码:

int main() {
   unsigned long long int s[11000][100];
   const rlim_t kStackSize = 32 * 1024 * 1024;
   struct rlimit rl;
   int result;

   result = getrlimit(RLIMIT_STACK, &rl);
   if (result == 0) {
      if (rl.rlim_cur < kStackSize) {
         rl.rlim_cur = kStackSize;
         result = setrlimit(RLIMIT_STACK, &rl);
         if (result != 0) {
            printf("error\n");
         }
   } else {
        printf("error\n");
   }

   // some code to manipulate with s (just for initialization)
   // ...
} // end main

但我仍然遇到分段错误(核心转储)错误。我还检查了堆栈大小,它的大小现在是 32 MB,是二维数组大小的 4 倍。还尝试将堆栈大小设置为 RLIM_INFINITY,但再次失败。谁能帮我找出原因和解决方案?太感谢了!

4

2 回答 2

5

鉴于此内存块的大小,您应该根据需要使用new[]ormallocdelete[]or来分配它free。或者,如果您使用 C++,您应该使用std::vector或其他一些堆分配容器。

它仍然崩溃的原因是因为它仍然试图在仍然有限的堆栈空间上分配超过一些限制,甚至在你尝试调整它之前。自动存储(即堆栈上)中的变量是在函数执行之前分配的。

于 2013-09-24T17:14:55.313 回答
2

克服这些类型问题的一种解决方案是:

Always declare large arrays globally.

这避免了像你这样的问题,因为全局变量的内存是在Initialized Data Segment. 有关更多信息,请参阅。希望这可以帮助。

于 2013-09-24T17:23:03.173 回答