【问题标题】:A variable changes his address with no reason变量无故更改地址
【发布时间】:2018-08-26 20:03:25
【问题描述】:

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

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

这些变量存储在某些类中..(与上面的代码不同)。 创建result 时,他的地址类似于0x28fddc。 并且指针变量采用这个地址。 突然,没有任何理由(也许),他的地址不再是 0x28fddc,而是类似于0x3a8c6e4。 使用指针变量,我试图通过以下方式更改结果变量:

*result = true;

但显然,这不起作用(并且它不会给我任何错误)。它不会改变结果变量,因为它在另一个地址中。 我不知道为什么会这样。 你能告诉我这是怎么发生的吗?我会尝试修复。 (这些类每次都在某些函数中使用通过引用传递的参数进行更新)。 例如:

void update_class(obj_class &obj);

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

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

按钮.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());

【问题讨论】:

  • 不,它没有。错误在其他地方。
  • 一种猜测是包含对象被复制到某处,然后指针指向旧对象。
  • PEBCAK :) :) :)
  • 请创建minimal reproducible example,以便我们看到您遇到的问题。
  • 突然,无缘无故——没有“突然”。一些代码在你做那个分配的时间和你发现事情发生变化的时间之间被执行了。

标签: c++ sdl-2


【解决方案1】:

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

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

 #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() 返回时不再存在。就您的程序而言,第一次调用 f() 中的变量 i 是与第二次调用 f() 期间的 i 不同的变量。

根据上面“其他代码”的情况,i 在第一次调用f() 时占用的内存可能在第二次调用f() 期间无法访问(例如,用于另一个变量) - 所以,在第二次调用f() 时,i 的地址将与第一次不同。没有任何保证 - 您也可能会走运(或不走运,取决于您如何看待它)并且打印的地址将是相同的。

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

例如,*p 的任何用法都喜欢

 *p = 42;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2019-06-24
    相关资源
    最近更新 更多