Мне было интересно, можно ли сделать что-то вроде этого:
unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address
То есть можно ли получить значение определенного адреса в памяти?
Спасибо
Мне было интересно, можно ли сделать что-то вроде этого:
unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address
То есть можно ли получить значение определенного адреса в памяти?
Спасибо
Можно и нужно написать так:
#include <cstdint>
uintptr_t p = 0x0001FBDC;
int value = *reinterpret_cast<int *>(p);
Обратите внимание, что если нет какой-либо гарантии, что p
указывает на целое число, это поведение undefined. Стандартная операционная система уничтожит ваш процесс, если вы попытаетесь получить доступ к адресу, который она не ожидала от вас. Однако это может быть обычным явлением в автономных программах.
(В более ранних версиях C++ должны быть указаны #include <stdint.h>
и intptr_t
.)
reinterpret_cast
? Я думаю, что последний просто распадается на первый в этом случае?
- person Alok Save; 06.09.2012
reinterpret_cast
. Значение приведений в стиле C в C++ определяется в терминах приведения типов в стиле C++ IIRC. Что касается компилятора, приведение в стиле C в C++ обычно является просто способом сказать, гм, я не уверен, какое приведение я хочу здесь, я выберу выбор шеф-повара. Я говорю «нормально», потому что думаю, что есть некоторые сомнительные вещи, которые вы можете делать с приведением в стиле C, но не с приведением в стиле C++: приведение от границы к производному к указателю на частную базу или что-то в этом роде.
- person Steve Jessop; 06.09.2012
reinterpret_cast
лучше.
- person Alok Save; 06.09.2012
intptr_t
в более ранних версиях C++? intptr_t
и uintptr_t
были добавлены в стандарты одновременно. (С другой стороны, поскольку такие вещи, очевидно, не переносимы, вы можете пойти дальше и использовать unsigned
, если это правильный размер. Или нет... Мне все равно нравится влияние uintptr_t
на документацию.)
- person James Kanze; 06.09.2012