变量无理由地更改其地址

时间:2018-03-17 23:36:59

标签: c++ sdl-2

也许这个问题会有点复杂,也许我错过了一些愚蠢的东西。 我会尝试解释没有任何源代码,因为我的项目很大,我不知道如何/从哪里开始。 我有:

bool result = false;
bool* pointer = &result;

这些变量存储在某些类中。(不在上面的代码中)。 创建result后,他的地址就像0x28fddc。 并且指针变量采用此地址。 Suddendly,没有任何理由(也许),他的地址不再是0x28fddc,而是0x3a8c6e4之类的东西。 使用指针变量,我试图通过执行以下操作来更改结果var:

*result = true;

但显然,这不起作用(它不会给我任何错误)。它不会更改结果var,因为它位于另一个地址中。 我不知道为什么会这样。 你能告诉我这怎么可能发生?我会尽力解决。 (这些类每次都在某些函数中更新,参数通过引用传递)。 例如:

void update_class(obj_class &obj);

(这些名称只是一个例子)。 我希望我已经清楚了,如果没有,我会删除这个话题。 抱歉英语不好,但我是意大利人:)

编辑: 现在我将尝试提供一些代码..

button.h

class button
{
public:
    void check_tap(SDL_Event* e);
    bool* done;
}

messagebox.h:

class messagebox 
{
public:
    messagebox();
    bool result_ok;
    button btn_ok;
}
void check_tap(std::vector<messagebox> &msgbox, SDL_Event* e) {
    for(unsigned int k=0; k<msgbox.size(); k++) {
        msgbox[k].btn_ok.check_tap(e);
        // check_tap is a function that i create for checking if the user is tapping the button with his finger or not. When the user presses the button and leaves it the done variable should become true, but result_ok seems not to be affected because his address here is different. This problem is only in this case using messagebox. I created more other buttons outside and all works perfect.
    }

}

messagebox.cpp:

messagebox::messagebox() {
    // Initializing things
    btn_ok.done = &result_ok;
    // Here, btn_ok.done gets the address of result_ok..
}

main.cpp中:

std::vector<messagebox> msgbox;
msgbox.push_back(msgbox());

1 个答案:

答案 0 :(得分:3)

不,变量的地址在其生命周期内不会改变。

但是,如果变量不再存在,则存储变量的地址是有问题的。一个简单的例子是

 #include <iostream>
 int *p;

 void f()
 {
     int i;
     p = &i;
 }

 int main();
 {
     f();
     std::cout << (void *)p << '\n';

     //    other code here

     f();
     std::cout << (void *)p << '\n';
 }

在上述情况下,p的两个值可能相同,也可能不同。这不是因为变量的地址改变了。这是因为每次调用i时都会创建一个变量f(),并在f()返回时停止存在。就您的计划而言,i第一次调用中的变量f()i第二次调用期间与f()不同的变量。

根据上面“其他代码”的内容,第一次调用if()占用的内存在第二次调用时可能无法访问(例如用于另一个变量) f()的{​​{1}} - 所以,在f()的第二次通话中,i的地址与第一次不同。没有保证 - 你可能也很幸运(或根据你的看法不幸),打印的地址也是一样的。

如果你得到的行为表明,变量的地址正在改变,那么 - 代码中的某个地方 - 就会出现某种形式的错误。通常,这将涉及将变量的地址存储在指针中,并在变量不再存在后使用(或访问)指针的值。并且该指针的任何dereferrencing(例如,访问指向的变量)具有未定义的行为。

例如,*p的任何用法,如

 *p = 42;

 std::cout << *p << '\n';
我在上面给出的main()中的

将给出未定义的行为。

指定包含该变量地址的指针的行为不会改变该变量的生命周期。