在Windows机器上我的程序崩溃但它正常工作在Linux

问题描述 投票:1回答:2

我想在我的笔记本电脑(Win10)程序阿克曼函数,但程序崩溃在更高的价值,而不是继续计算几分钟或几小时。

我的朋友尝试同样的代码他的机器(SUSE)上和它的工作就好了,那么我们就尝试了学校服务器(CentOS的),并将其再次崩溃。

编辑:它的工作在服务器上,它只需要一个第二次尝试。它还努力,我们曾试图在其他服务器上...所有的它是在Linux上。

我们怀疑堆栈溢出是它背后却是奇怪的,因为价值不高呢。我怎么能在这个系统上瓶坯递归函数呢?

感谢所有的答案。我只是好奇,为什么会发生,以及如何使我的机器上工作。

我试图用C和C ++来没有变化。

#include <stdio.h>

int ackermann (int m, int n);

int main () {

  int m = 4;
  int n = 1;

  return ackermann(m,n);
}

int ackermann (int m, int n)
{
  if      (m == 0)          return n=n+1;
  else if (m > 0 && n == 0) return ackermann(m-1,1);
  else if (m > 0 && n > 0)  return ackermann(m-1,ackermann(m,n - 1));
}
c++ c linux windows stack-overflow
2个回答
1
投票

在Visual Studio中的默认堆栈大小为1 MB,所以用的65535递归深度,而且,我相信,支持来电最低堆栈帧/这种类型的64位功能是72个字节,所以你会耗尽可用堆栈帧为你的程序空间(我几乎计算堆栈4.5MB所需的这种情况下)。这也产生了堆栈缓冲区溢出错误,并没有任何与堆栈溢出等编译的时候比你超出了可用的最大堆栈大小到您的程序。

大多数编译器包括Visual Studio中让你指定的堆栈大小。

更多细节:https://docs.microsoft.com/en-us/cpp/build/reference/f-set-stack-size?view=vs-2017

[编辑以反映65535点的帧,而不是1.4十亿]


2
投票

听起来像它的堆栈砸,或者更准确地说是stack buffer overflow,这是你得到了错误的信息。该函数有一个非常大的深度,并将继续在堆栈上推变量。如果你把足够的变量到堆栈中,它会粉碎。计算机并没有无限的存储栈和从它的声音,而不是一个疯狂的金额无论是。

如果有足够大的投入,应该栈如果没有优化的不错(和可能仍然反正)任何粉碎。不知道更多关于你的编译器,也不能就如何禁用它全面的选择,但如果你使用Microsoft Visual Studio的编译器套件,您可以禁用保护if I understand this doc correctly

  1. 在Solution Explorer中,用鼠标右键单击该项目,然后单击属性
  2. 在属性页对话框中,单击C / C ++文件夹。
  3. 单击代码生成属性页。
  4. 修改缓冲区安全检查属性。

作为一个警告,这是不是安全的坏事情都可能发生,所以用这个风险自担。

© www.soinside.com 2019 - 2024. All rights reserved.