变量无缘无故地更改了他的地址
A variable changes his address with no reason
也许这个问题会有点复杂,也许我错过了一些愚蠢的东西。 我会尝试在没有任何源代码的情况下进行解释,因为我的项目很大,我不知道如何/从哪里开始。 我有:
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()
中,将给出未定义的行为。
分配指针以包含该变量地址的操作不会更改该变量的生存期。
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- ReadProcessMemory() 不适用于像 0x2840C6C68D8 这样的长地址
- CUDA:统一内存和指针地址的更改
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 变量无缘无故地更改了他的地址