C++-如何正确地确定变量的地址
C++ - How to correctly determine the address of a variable?
我正试图弄清楚如何确定变量的内存地址。我不知道哪种方法是正确的。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
void print(std::string *url) {
std::string url_1 = "http://example.com";
cout << url << endl;
cout << "Adress: " << &url << endl;
*url = url_1;
cout << "Adress: " << &url << endl;
}
int main() {
std::string a = "http://google.com";
print(&a);
cout << a << endl;
cout << &a << endl;
return 0;
}
输出:
0xbfa1ba48
Address: 0xbfa1ba34
Address: 0xbfa1ba34
http://example.com
0xbfa1ba48
当改变一个变量的内容时,内存地址也会改变吗?如何获得变量的实际内存地址?
在代码中,url
是一个指针,包含传递给函数的任何地址,恰好是a
的地址。请注意,每次输出url
和&a
时都会得到相同的结果。
另一方面,表达式&url
取url
变量本身的地址(因此与它所指向的字符串对象无关)。但是,&url
的值在每次输出时都是相同的
所以不,改变一个对象不会改变它的内存地址。
使用'&'运算符是获取变量地址的正确方法。然而,你的程序并没有很好地证明这一点。
void print(std::string *url) {
您正在接收变量URL中的字符串对象的地址。
cout << "Adress: " << &url << endl;
这里打印的是包含字符串对象地址的变量的地址,而不是字符串对象本身的地址。
*url = url_1;
前面的"*"取消引用指针url,因此这是为原始变量分配一个新值。
它不会更改指向原始字符串对象的指针的地址。
它甚至不会更改原始字符串对象的地址。C++中的字符串被实现为对象,这些对象在内部存储指向包含字符串的字符数组的指针,所以您只是在更改字符串对象的内部内容,而不是它的地址。
一般来说:为变量赋值不会更改变量的地址,只会更改其内容。
我试图分解以下代码,
int pranit = 2;
int& sumit = pranit;
int main(int argc, char** argv) {
sumit++;
return sumit;
}
下面的说明表明普拉尼特有苏米特的地址。
013B13C8 8B15 04803B01 MOV EDX,DWORD PTR [sumit] ; ConsoleA.pranit
此外,两个变量都有不同的地址,
Names in ConsoleA, item 313
Address=013B8004
Section=.data
Type=Library
Name=sumit
Names in ConsoleA, item 257
Address=013B8000
Section=.data
Type=Library
Name=pranit
我使用OllyDbg作为反汇编程序。
获取变量地址的正确方法是使用std::addressof()
。
&
主要完成这项工作,但(可能)会因operator &
过载(以及虚拟继承)而失败。
相关文章:
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 变量地址的运算符[]是如何工作的
- C 给出了一个字符串列表,如何从类中获取各个变量地址
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 获取封装在命名空间中的静态变量地址
- 为什么分配的变量地址之间相差 16 个字节?
- 为什么在循环中定义的变量地址在每次迭代中都保持不变
- 是否可以使用指向语句中声明的变量地址的指针"if"
- 字符串从变量(&变量)地址的长度 - 嵌入式C
- 汇编:C++堆栈变量地址不同/错误?
- x 在变量地址中的意义是什么?
- 在哪里放置 HW BP 以捕获全局变量地址损坏
- C++变量地址不匹配
- 重载 std::ostream 运算符<<未调用,stream 获取变量地址而不是对象
- std矢量包含指针和变量地址.清理
- 注册变量地址
- 使用内联程序集获取变量地址
- 如果用调试信息编译,则通过其名称获取全局变量地址
- 如何在Visual Studio中复制变量地址
- 当堆栈内存中的变量地址分配给数据段或堆内存中的指针时,是否有任何错误?