2016-07-03 4 views
3

Я все еще изучаю C++ и потратил часы, пытаясь выяснить способ получения байта, хранящегося на определенном адресе памяти, в моем случае ВСЕ (ну, почти все) адреса памяти не являются динамическими, поэтому адреса, указывающие на , например, переменные не изменятся.Получить байт с адреса памяти?

Итак, я пытаюсь получить один байт, хранящийся на известном адресе памяти. Например: 0x20000

Байт, который я пытаюсь получить, например, допустим, 0xEF.

Теперь, как я могу получить байт без использования оператора разыменования? Так что в принципе мне нужно получить 0xEF, не объявляя, какой тип данных он есть, как буквально просто физически получает байт 0xEF. Надеюсь, что это имеет смысл, я совсем нуб:/

+1

'uint8_t mybyte = * reinterpret_cast (0x20000);' – md5i

+0

Когда вы говорите '0xEF' что смещение от ячейки памяти «0x20000»? – Galik

+0

Если Galik верен, добавьте '0xef' в выражение, которое я опубликовал ранее. – md5i

ответ

3

Теперь, как бы я получить байт без использования оператора разыменования?

Вы не можете сделать это без разыменования доступного адреса. Наименьший тип данных, который вы можете указать, - char. Для байтов обычно используется typedef unsigned char uint8_t.

Таким образом, вам нужно получить доступ к адресу памяти с помощью reinterpret_cast<uint8_t*>(addr) и разыменовать это значение.

1

Выделение адреса памяти является единственным способом получить значение байта.

типажей адрес памяти в типизированной указатель, а затем разыменования это прямой путь наиболее , например:

unsigned char value = *(reinterpret_cast<unsigned char*>(0x20000)); 

Однако, чтобы ответить на ваш вопрос:

как бы я восстановить байт без использования оператора разыменования?

Вы можете разыменовать память косвенно с использованием memcpy() или аналогичную функцию, например:

#include <cstring> 

unsigned char value; 
std::memcpy(&value, (void*)0x20000, 1); 

 Смежные вопросы

  • Нет связанных вопросов^_^