Как правильно напечатать адрес переменной в памяти?

я пытаюсь понять, как структуры c или c++ хранятся в памяти.

Я написал небольшую программу на С++, скомпилировал и запустил ее в отладчик. я использовал printf с %p и &variable для печати адреса, но распечатанный адрес и фактический адрес в памяти совершенно разные. на самом деле печатный адрес даже недействителен.

Любая идея, как я могу правильно напечатать реальный адрес переменной или структуры?

Спасибо

вот исходный код программы, которую я написал:

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define XXX __asm__("nop");

int main(){
    XXX;
    XXX;
    const char *short_string = "this is a short string";
    const wchar_t *long_string = L"this is a long string";
    int a = 2;
    int b = 3;
    int c = a + b;
    int *pointer_to_a = &a;

    std::cout << "the address of short_string is: " << &short_string << std::endl;
    std::cout << "the address of long_string is: " << &long_string << std::endl;
    std::cout << "the address of a is: " << &a << std::endl;
    std::cout << "the address of a is: " << pointer_to_a << std::endl;
    std::cout << a << "+" << b << "=" << c << std::endl;
    std::cout << std::endl;
    XXX;
    XXX;
    getch();
    return 0;
}

это вывод скомпилированной программы: скомпилированная программа

это расположение переменных в памяти: вывод отладчика


person johndoe    schedule 08.03.2019    source источник
comment
Похоже, вы совершаете распространенную ошибку новичка, путая адрес переменной-указателя с адресом, на который указывает переменная. Попробуйте сравнить cout << &ptr; с cout << (void*)ptr;. Все переменные имеют адреса (адрес, по которому они хранятся), но, кроме того, переменные-указатели имеют адрес, на который они указывают. Это источник большой путаницы.   -  person john    schedule 08.03.2019
comment
&short_string отличается от того, что вы думаете   -  person rtpax    schedule 08.03.2019


Ответы (1)


Чтобы напечатать местоположение вашей строки, вам нужно: std::cout ‹‹ (void*)short_string;

В вашем примере вы пишете адрес, где находится ваша локальная переменная, которая находится в стеке

person Gojita    schedule 08.03.2019