将指针传递给函数会更改数据并导致程序崩溃

时间:2015-06-16 11:03:45

标签: c++

我是c ++的新手,但不是OOP。这次崩溃让我非常困惑。

这是我的主要内容。这段代码有效。它打印出我想要打印的内容。

int _tmain(int argc, _TCHAR* argv[]) {
    Weapon* wp = createWeapon();

    cout <<wp->name << " " << wp->maxAttack << " " << wp->minAttack; //<<---Works fine
}

但是。下面的代码,只通过一个函数传递它做同样的事情,崩溃了。我不明白为什么。我尝试过任何我能想到的东西,但是在进入新功能后,某些东西会改变数据而崩溃。

void showWeaponInfo(Weapon* w) {

    cout << "Weapon: " << w->name << "\n"; //Wont work!??!
}

int _tmain(int argc, _TCHAR* argv[]) {
    Weapon* wp = createWeapon();

    showWeaponInfo(wp);
}

我已经调试了,这表明在进入新功能时,&#34; wp&#34;变化。以下链接是调试的图像。

enter image description here

enter image description here

我做错了吗?有人遇到过这个问题吗?将指针作为参数传递时,你是否必须考虑一些特殊的东西?

2 个答案:

答案 0 :(得分:2)

在VC ++中,调试器将未分配变量的值设置为每字节204或在您的情况下 - 0xCCCCCCCC

这意味着你的createWeapon()会返回未初始化的指针。

答案 1 :(得分:1)

你没有告诉我们你的createWeapon()。但我想createWeapon()会返回局部变量的指针。你的功能是这样的吗?

Weapon* createWeapon()
{
    Weapon wp(/*blabla*/);
    // ...
    return &wp;
}

如果是这样,您就遇到了未定义的行为

createWeapon()的末尾,wp变量createWeapon()的局部变量被销毁。因此,返回的指针指向&#34;销毁&#34;宾语。如果您尝试取消引用该指针,程序将处于未定义的行为,这意味着无人知道将会发生什么。

但是,在调用createWeapon()后,直接wp变量可能仍然存在 - 因为尚未触及堆栈帧。这就是您的第一个示例似乎工作的原因。但在第二个示例中,您调用showWeaponInfo(),并且调用更改堆栈帧。