变量无缘无故地更改了他的地址

A variable changes his address with no reason

本文关键字:地址 无缘无故 变量      更新时间:2023-10-16

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

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;
}

消息框.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.
}
}

消息框.cpp:

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

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

根据上面"此处的其他代码"发生的情况,i在第一次调用f()时占用的内存在第二次调用f()期间可能无法访问(例如用于另一个变量) - 因此,在第二次调用f()期间,i将具有与第一次调用期间不同的地址。 没有保证 - 你也可能很幸运(或不走运,取决于你如何看待它),打印的地址将是相同的。

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

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

*p = 42;

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

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

分配指针以包含该变量地址的操作不会更改该变量的生存期。