尝试研究它时会消失的bug

时间:2011-05-29 19:41:10

标签: c++ debugging

在C ++编程时,这是我遇到过的最奇怪的事情。

这是我的主要文件:

#include <iostream>
#include "lib/utils.h"

using namespace std;

int main(int argc, const char *argv[]) {
    cout << bin2dec(101000010);
    return 0;
}

这是lib / utils.cpp:

#include <iostream>
#include "utils.h"

int bin2dec(int bin) {
    // 101000010
    int dec;
    //std::cout << "";  // If you uncomment this, it works.
    for (int i = 1; bin > 0; i *= 2, bin /= 10) {
        if (bin % 2 == 1) {
            dec += i;
        }
    }
    return dec;
}

程序编译时没有警告,运行时输出450。 450不是十进制的101000010,322是。第一个奇怪的是482和322之间的差异恰好是128.这种情况发生在您尝试转换的任何二进制数字上。但真正奇怪的是,当我试图在bin内输出decfor的值以尝试调试函数时,它突然开始正常工作。

基本上,出于某种原因,如果你在函数返回之前std::cout有什么东西,它就可以了。如果不这样做,则会在结果中添加128。

我正在使用g ++ 4.6.0,并且编译如下:

g++ -c   -D NDEBUG -O2     -o 10.o 10.cpp
g++ -c   -D NDEBUG -O2     -o lib/utils.o lib/utils.cpp
g++  -o 10   -Wl,-S  10.o lib/utils.o lib/menu.o 

5 个答案:

答案 0 :(得分:23)

你没有初始化dec。

int dec = 0;

答案 1 :(得分:16)

小错误是您没有初始化dec变量。

更大的错误是你在编译时不习惯添加-Wall-O2(因为你编写的程序会变得更复杂,会导致很多痛苦)。

-Wall启用所有警告,-O2需要优化(优化包括会引发有关未初始化变量的警告的代码路径分析)。

答案 2 :(得分:3)

int dec;

创建dec但从不给它一个初始值(如0)。然后,您可以为其添加值,并以随机结果结束。

答案 3 :(得分:3)

您需要在函数中将dec初始化为零:

int dec = 0;

通过不初始化它,它从变量位置的内存中的任何随机crud开始。对cout <<的调用可能会影响该区域的内容,因此会发生变化。顺便说一句,当我尝试你的代码时,我没有得到450。我得到了134514688,这给出了一个例子。

答案 4 :(得分:0)

很简单,你的问题尖叫堆栈或堆粉碎给我 - 可能是堆栈,因为函数的所有操作都在堆栈上。如果不在程序的其他地方调用一些讨厌的未定义行为,就不会遇到这种问题。

编辑:哦是的 - 你可以从初始化dec开始,仅举例来说。