Единственный способ увидеть адрес - это использовать такие инструменты, как objdump, но вы никогда не увидите адрес локальных переменных. Они не существуют во время компиляции, размещаются в стеке во время выполнения. Единственное, что вы увидите в exe, это asm / машинный код, который выполняет push или sub sp, что является выделением.
Если вы измените свою программу на:
#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 data
и вы увидите:
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 (это их искаженные имена).
РЕДАКТИРОВАТЬ: для текущей версии вашего примера кода, с глобальными символами a & b, a будет .text и b .rodata, так что теперь вам нужно будет использовать «текст» в фильтре grep, чтобы увидеть a.