一个变量无缘无故地改变了他的地址

A variable changes his address with no reason

也许这个问题会有点复杂,也许我遗漏了一些愚蠢的东西。 我将尝试在没有任何源代码的情况下进行解释,因为我的项目很大而且我不知道 how/where 开始。 我有:

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

这些变量存储在一些类..(不像上面的代码)。 当result被创建时,他的地址类似于0x28fddc。 并且指针变量采用该地址。 突然间,没有任何原因(也许),他的地址不再是 0x28fddc,而是类似于 0x3a8c6e4。 使用指针变量,我试图通过执行以下操作来更改结果 var:

*result = true;

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

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());

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

但是,如果变量不复存在,存储变量的地址就会出现问题。一个简单的例子是

 #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的两个值可能相同,也可能不同。这不是因为变量的地址改变了。这是因为每次调用f()时都会创建一个变量i,而在f() returns时不复存在。就您的程序而言,f() 的第一次调用中的变量 if().[=28 的第二次调用中来自 i 的不同变量=]

根据上面 "other code here" 发生的情况, if() 的第一次调用中占用的内存在调用期间可能无法访问(例如用于另一个变量) f() 的第二次调用 - 因此,在 f() 的第二次调用期间,i 将具有与第一次不同的地址。没有任何保证——您也可能幸运(或不幸,取决于您的看法)并且打印的地址将是相同的。

如果您得到的行为向您暗示变量的地址正在更改,那么 - 在您的代码中的某处 - 存在某种形式的错误。通常,这将涉及将变量的地址存储在指针中,并在变量不复存在后使用(或访问其值)指针。并且该指针的任何取消引用(例如访问指向的变量)都具有未定义的行为。

例如,*p 的任何用法如

 *p = 42;

 std::cout << *p << '\n';

在我上面给出的 main() 中会给出未定义的行为。

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