c++中引用变量的地址
Address of reference variable in c++
我有以下c++代码
#include <iostream>
using namespace std;
int a=100;
int &b = a;
int main ( int argc, char ** argv)
{
cout << " a "<<a<<" b"<<b<<endl;
b = 200;
cout <<"a "<<a<<endl;
}
我想在对象文件的符号表中查看a和b的地址?
#gcc -g -o ref ref.cpp -lstdc++
有像objdump、readelf这样的工具。但我不熟悉这些工具。请提供在目标文件[即:在符号表]中查找a和b地址的建议方法
注意:我已经进行了编辑,将变量从局部移动到全局。
引用变量的地址与其引用的对象的地址相同。
即:
&b == &a
这是由标准很好地定义的,并且将永远是正确的
你在努力实现什么?
cout << " &a " << &a <<" &b "<< &b <<endl;
这将显示两者的地址,并确认它们在同一地址。
这些是在堆栈上分配的局部变量。当程序运行时,将获得内存,从而获得地址。
您不会从对象文件中获取地址。
查看地址的唯一方法是使用objdump等工具,但您永远看不到局部变量的地址。它们在编译时不存在,在运行时在堆栈中分配。你在exe中看到的唯一一件事是执行push或sub-sp的asm/machine代码,也就是分配。
如果您将程序更改为:
#include <iostream>
using namespace std;
int main ( int argc, char ** argv)
{
static int a=100;
static int &b = a;
cout << " a "<<a<<" b"<<b<<endl;
b = 200;
cout <<"a "<<a<<endl;
}
然后编译do:
objdump-t ref|grep数据
你会看到:
080488a8 l d .rodata 00000000 .rodata
08049a94 l d .data 00000000 .data
080488bc l O .rodata 00000004 _ZZ4mainE6b
08049a9c l O .data 00000004 _ZZ4mainE6a
08049a94 w .data 00000000 data_start
080488a8 g O .rodata 00000004 _fp_hw
080488ac g O .rodata 00000004 _IO_stdin_used
08049a94 g .data 00000000 __data_start
08049a98 g O .data 00000000 .hidden __dso_handle
08049aa0 g *ABS* 00000000 _edata
您要查找的变量是_ZZ4mainE6a_ZZ4mainE6b(这些是它们的错误名称)。
EDIT:对于您的示例代码的当前版本,使用&b作为全局变量,a将是.text和b.rodata,所以现在您必须在grep过滤器中使用"text"才能看到a。
您可以在最终的可执行文件上使用"nm"工具。像这样:
$nm-C你好080490ba A __bss_start080490ba A _数据080490bc结束08048083 T _启动08048080 t访问.bsd.内核080490ac d h字节080490ac d你好$
输出的第一列是一个符号的地址,之后是它的类型,然后是它的名称。
相关文章:
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- 通过按地址访问变量
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 为什么同一个变量的内存地址不同?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 不同块作用域中的 C++ 变量具有相同的地址
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- C++在变量的内存地址上做什么来"deallocate"它?
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 如何找到在本地范围内声明的变量的地址?
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?
- 为什么变量的打印地址在每次执行时都会打印随机值,即使它是 C 中的逻辑地址?
- 变量地址的运算符[]是如何工作的
- 使用基地址和偏移量获取变量的地址
- 两个不同的进程,在同一地址上有 2 个 std::atomic 变量?
- libmysql:警告:返回局部变量"行"的地址(C++/C)