У меня проблема - со следующим кодом я пытаюсь выяснить, что хранится на определенном адресе и как долго моя статическая переменная хранится в этой конкретной позиции. (Я читал, что статические переменные хранятся бесконечно и были весьма удивлены - хотели проверить, было ли это правдой). Код определяет статическую переменную (ее адрес в моей системе равен 0x1000020c0. Вероятно, это случайный случай, но он был постоянным)Адрес переменной необходимо загрузить в память?
Если я сейчас хочу узнать, какое целочисленное значение хранится по этому адресу, я должен сначала распечатайте адрес с помощью $ number, который затем дает 0x1000020c0. Повторное или повторное толкование адреса (0x1000020c0) дает только 100! если адрес был напечатан до или если я использую номер & при повторной интерпретации/переработке.
Может кто-нибудь объяснить, почему это так?
int static number = 100;
// std::cout << number << std::endl; <- prints 100
// prints 100 and the address 0x1000020c0 in my case
// std::cout << number << " " << &number << std::endl;
// this does not work unless &number is printed previously
// std::cout << "Value is : " << *reinterpret_cast<int*>(0x1000020c0) << std::endl;
// this does work and show the correct value (100)
std::cout << "Value is : " << *reinterpret_cast<int*>(&number) << std::endl;
Поскольку, скорее всего, переменная не находится в этом адресе памяти, когда код отличается. –
«хранится бесконечно» означает только время жизни программы, а не буквально до конца времени. – pjc50
Ознакомьтесь с [правилом as-if] (http://stackoverflow.com/questions/15718262/what-exactly-is-the-as-if-ru). У вас есть наивная необоснованная ментальная модель для C++ и необоснованных убеждений о том, что делают C++-программы и конкретные операторы. Руководство по языку/библиотеке/справочник/спецификация сообщает вам, что вы можете ожидать, когда запускается программа; вы не имеете права ничего ожидать. – philipxy