2017-01-19 5 views
-4

Я нашел, что код по этой ссылке ("How to get the starting/base address of a process in C++?").Адрес памяти, и как напечатать его значение

Когда я запускаю его, он говорит мне («Базовый адрес: 400000») Теперь я знаю, что работа с адресом памяти работает с шестнадцатеричным, а не десятичным. Поэтому есть много вопросов, которые я хочу задать вам:

  1. Как я могу перевести его в адрес памяти?
  2. Как я могу использовать этот адрес & изменить значение?
  3. Можно распечатать ВСЕ адрес памяти, который использует этот процесс?
  4. Возможно получить значение, указанное адресом?

Благодаря

+4

«Теперь я знаю, что адрес памяти работает с шестнадцатеричным, а не десятичным» - это не так, и это едва ли имеет смысл. – immibis

+1

База, используемая для представления числа, не имеет значения для значения этого номера. 0x10 16 и двоичные 10000 - одинаковые значения. –

+0

это уже адрес памяти, но обозначение «0x400000». для изменения этого адреса вы не можете его постоять, как вы пишете: '5 ++'. для печати значения внутри него вы используете оператор разыменования '*': 'cout << * ptrToAddr;' – Raindrop7

ответ

0

Как я могу перевести его в адрес памяти?

Номер уже представляет собой адрес памяти, не требуется никаких переводов.

Как я могу использовать этот адрес & изменить значение?

На арене встроенных систем мы берем указатели и назначаем их указателям. Если мы хотим получить доступ к 16-разрядным регистрам или адресу памяти, мы должны назначить указатель uint16_t на значение.
uint16_t * memory_pointer = (uint16_t *) 0x40000000;

Можно печатать все адреса памяти, что процесс использует?

Это проблема с операционной системой. Некоторые операционные системы пытаются в значительной степени предотвратить доступ одной программы к области памяти другого процесса. «Другой процесс» может быть заменен на диск при запуске вашего процесса и использовать ту же область памяти, что и ваш процесс. Так что это возможно или не зависит от операционной системы вашей платформы.

Возможно получить значение, указанное адресом?

В зависимости от операционной системы и платформы. Некоторые платформы имеют память на определенных адресах, и доступ к адресу за пределами этого диапазона приводит к неопределенным поведением.

Некоторые операционные системы защищают доступ к памяти вне вашего процесса (например, память ядра). Результаты доступа к памяти в этом случае зависят от операционной системы.

Метод доступа к памяти заключается в разыменовании указателя. В C++ для доступа к байтам вы должны использовать указатель на uint8_t.

+0

Спасибо @Thomas Matthews, это было ясно и полно. Я использую Windows 10 ... –