c ++中引用变量的地址

时间:2012-02-02 11:04:27

标签: c++ linux gcc

我有以下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这样的工具。但我不熟悉这些工具。请赞成使用suggession的方法来查找目标文件中的a和b的地址[即:在符号表中]

注意:我已编辑将变量从本地移动到全局。

5 个答案:

答案 0 :(得分:4)

引用变量的地址与它引用的对象的地址相同 即:

&b == &a

这标准很明确,并且永远都是正确的 想要实现什么目标?

答案 1 :(得分:1)

  cout << " &a  " << &a <<"  &b "<< &b <<endl;

这将显示两者的地址,并确认它们位于同一地址。

答案 2 :(得分:0)

这些是在堆栈上分配的局部变量。程序运行时会获得内存和地址。

您不会从目标文件中获取地址。

答案 3 :(得分:0)

查看地址的唯一方法是使用像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;
}

然后编译完成后:

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(这些是它们的错位名称)。

编辑:对于当前版本的示例代码,使用&amp; b作为全局变量,a将是.text和b .rodata,所以现在你必须在grep过滤器中使用“text”才能看到。

答案 4 :(得分:0)

您可以在最终的可执行文件中使用“nm”工具。 像这样:

$ nm -C你好 080490ba A __bss_start 080490ba A _edata 080490bc A _end 08048083 T _start 08048080 t access.the.bsd.kernel 080490ac d hbytes 080490ac你好 $

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