c++中引用变量的地址

Address of reference variable in c++

本文关键字:地址 变量 引用 c++      更新时间:2023-10-16

我有以下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你好$

输出的第一列是一个符号的地址,之后是它的类型,然后是它的名称。