Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用setrlimit更改堆栈大小后仍会出现分段错误(堆芯转储)错误 我在Ubuntu中编写了一个C++程序。在main函数中,我有这样的二维数组: int main() { unsigned long long int s[11000][100]; // some code to manipulate with s (just for initialization) // ... }_C++_C - Fatal编程技术网

C++;使用setrlimit更改堆栈大小后仍会出现分段错误(堆芯转储)错误 我在Ubuntu中编写了一个C++程序。在main函数中,我有这样的二维数组: int main() { unsigned long long int s[11000][100]; // some code to manipulate with s (just for initialization) // ... }

C++;使用setrlimit更改堆栈大小后仍会出现分段错误(堆芯转储)错误 我在Ubuntu中编写了一个C++程序。在main函数中,我有这样的二维数组: int main() { unsigned long long int s[11000][100]; // some code to manipulate with s (just for initialization) // ... },c++,c,C++,C,程序无法运行。在网上搜索之后,我知道二维数组的大小超过了Ubuntu中默认的堆栈大小,大约8MB。我尝试了一些在我的程序中自动改变堆栈大小的建议。因此,我添加了几行代码: int main() { unsigned long long int s[11000][100]; const rlim_t kStackSize = 32 * 1024 * 1024; struct rlimit rl; int result; result = getrlimit(RLIM

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

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
intmain(){
无符号长整型[11000][100];
常数rlim_t kStackSize=32*1024*1024;
结构rlimit-rl;
int结果;
结果=getrlimit(RLIMIT_堆栈,&rl);
如果(结果==0){
如果(rl.rlim_cur

但我仍然有分段错误(核心转储)错误。我还检查了堆栈大小,它的大小现在是32 MB,比2-D数组的大小大4倍。也尝试将堆栈大小设置为RLIM_INFINITY,但再次失败。有人能帮我找出原因和解决方案吗?非常感谢!

鉴于此内存块的大小,您应该使用
new[]< /代码>代码> Malc C++ >代码> >代码>删除[]/COD>或<代码>免费< /代码>。如果使用C++,则应使用<代码> STD::vector < /C>或其他堆分配容器。


它仍然崩溃的原因是,在您尝试调整堆栈空间之前,它仍然试图在仍然有限的堆栈空间上分配更多的限制。自动存储中的变量(即堆栈上的变量)是在函数执行之前分配的。

克服此类问题的一个解决方案是:

Always declare large arrays globally.

这避免了像您这样的问题,因为全局变量的内存是在
初始化数据段中分配的。
有关更多信息,请参阅。希望这有帮助。

所以…很好奇…为什么您觉得需要堆栈分配此数组?在分配堆栈之前,可能必须知道堆栈大小。建议:尝试to在堆上分配。如果是C++,则使用<代码> STD::vector < /COD>或 STD::数组< /COD>。尝试将它创建为全局数组。这是一个在堆栈上分配的大数组,因此将其从堆栈中移出。将其移出<代码>主()
到文件范围,或者按照@Mahesh的建议将其从堆中分配。除非您的平台有一个80字节的
无符号长
,否则它不是8MB。发布的代码是
11000*10*sizeofunsigned long)
,对于一个8字节的实现,880000字节;880kb。除此之外,我同意堆栈可能会溢出,但不是因为8MB的命中率。很抱歉,我的二维数组是11000 x 100,而不是11000 x 10。@user2812045这只是数学问题。最终我认为greyfade是正确的。采取一些步骤来调试它,将其移出main,使其成为静态、动态分配等。这个答案是正确的。嗨,WhozCraig,我将其移出main函数,并成功运行。我调试ged并收到这条消息:分段错误(内核转储)我还把这行:“unsigned long long int s[11000][100]”放在堆栈大小修改代码的末尾。但它仍然不起作用。