我的程序在Windows机器上崩溃了,但在Linux上运行良好
My program crashes on the Windows machine yet it works fine on the Linux
我试图在笔记本电脑(Win10)上编程Ackermann函数,但程序在更高的值下崩溃,而不是继续计算几分钟或几个小时。
我的朋友在他的机器(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));
}
听起来像是堆栈崩溃,或者更准确地说是堆栈缓冲区溢出,这就是您收到的错误消息。该函数具有非常大的深度,并且将继续在堆栈上推送变量。如果你把足够多的变量推到堆栈上,它就会崩溃。计算机并没有无限的内存用于堆栈,从它的声音来看,也不是一个疯狂的数量。
给定足够大的输入,如果没有很好地优化(无论如何可能仍然如此),它应该会堆叠任何粉碎。如果不了解编译器的更多信息,就不可能有一个全面的选项来禁用它,但如果你使用的是Microsoft Visual Studio的编译器套件,如果我正确理解本文档,你可以禁用保护。
- 在解决方案资源管理器中,右键单击项目,然后单击"属性">
- 在"属性页"对话框中,单击C/C++文件夹
- 单击"代码生成"属性页
- 修改"缓冲区安全检查"属性
作为警告,这是不安全的并且可能会发生不好的事情,因此使用此方法的风险自负。
在Visual Studio中,默认堆栈大小为1MB,因此递归深度为65535,而且,我相信这种类型的x64上调用程序/函数的最小堆栈帧为72字节,因此您的程序将耗尽可用堆栈帧空间(我计算出这种情况所需的堆栈几乎为4.5Mb)。这也产生了堆栈缓冲区溢出错误,与堆栈粉碎无关,只是编译时超出了程序可用的最大堆栈大小。
包括Visual Studio在内的大多数编译器都允许您指定堆栈大小。
更多详细信息:https://learn.microsoft.com/en-us/cpp/build/reference/f-set-stack-size?view=vs-2017年
[编辑以反映65535帧,而不是14亿]
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- strcpy 在 Windows 上编译,但在 Linux 上不编译
- 在 Windows 上编译错误 C2131 和 C3863,但在 Linux 上不编译错误
- pthread在Windows中比串行快,但在Linux中比串行慢
- FCGX_GetParam REQUEST_METHOD可以在Windows中使用,但在Linux中返回NULL
- 为什么我的文件/目录操作在Windows上工作正常,但在Linux上不能
- 我的程序在Windows机器上崩溃了,但在Linux上运行良好
- Mutex锁会在mingw中暂停程序,但在linux上不会
- C++程序在VS上运行平稳,但在Linux Mint上运行不畅
- Ostream Tellp在Windows上失败,但在Linux上没有失败
- 枚举在Windows上具有意想不到的价值,但在Linux上没有
- 我的程序在Windows上使用MSVC和G 编译器运行,但在Linux上不运行
- 分段错误(核心转储) - 代码在 VS 中有效,但在 Linux 终端中不起作用
- 为什么我的程序在Windows上运行良好,但在linux上运行不好
- 标识符"creal"未定义 - 在 Mac 上可见,但在 Linux 上看不到
- 代码在 CodeBlock 中工作,但在 Linux 中编译时会出现错误
- C/C++/ObjectiveC之间的内存差异,程序在 codepad.org 崩溃,但在Linux上不会崩溃
- C++输出到Windows终端使用cout<<term_cc<color,default,attrib>在Windows上正确输出颜色和属性,但在Linux上不能
- 运算符>>在Visual C++ 2010中工作,但在Linux上不能使用G++。
- 可移植编程——在Win32上链接失败,但在linux上链接失败