将fprintf()插入此循环会导致它无限循环。为什么?

时间:2012-02-20 01:32:15

标签: c

我有这个循环,它解析机器代码并模拟指令,就像它是一个处理器一样。如果在任何时候我尝试访问超出程序定义为内存大小(1MB)的内存位置,它将打印一个错误,表示我超出了范围。

这是一项学校作业,因此如果我的代码正确,所有输入二进制文件都应正常工作。但是在其中一个二进制文件中,我有一个错误声明我正在尝试访问此范围之外的内存。所以我想在那里放一个fprintf()(或只是printf(),这没关系)语句来查看我的一些变量的内容。但是,当我这样做时,我会得到完全不同的行为。我从来没有得到这个消息,而是程序无限循环。我没有改变任何其他事情。似乎我打印的并不重要。插入printf("hello")会导致相同的行为。

如果我将fprintf()放在打印错误的函数中,我就不会得到无限循环,所有内容都按照我的预期进行打印。

这是一个相当大而复杂的程序,所以我不能把它粘贴在这里,我不认为只有一小部分就足够了,所以我希望我已经提供了足够的信息来获得帮助。

我在我的陈述结尾处添加换行符,因为我已经读过应该刷新缓冲区,但即使我添加fflush(stdout),它似乎并不重要。

1 个答案:

答案 0 :(得分:1)

根据您能够提供的信息,听起来您的程序正在展示未定义的行为。未定义的行为并不一定意味着程序将崩溃,它似乎可以正常工作。在您更改其他内容之前,例如在某处添加fprintf(),它可能会失败。

您可能希望尝试在Valgrind下运行程序以帮助捕获与内存相关的错误。此外,在编译器上一直打开警告级别并修复它找到的所有内容。

CppcheckClang Static Analyzer等静态分析器也很有帮助。