С++ - получить значение определенного адреса памяти

Мне было интересно, можно ли сделать что-то вроде этого:

unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address

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

Спасибо


person Zyyk Savvins    schedule 06.09.2012    source источник
comment
Вы еще не пробовали?   -  person cli_hlt    schedule 06.09.2012
comment
Что вы хотите сделать с адресом, если вы можете получить его? Совет: не делайте этого.   -  person Alok Save    schedule 06.09.2012
comment
@Als - иногда неизбежно, особенно. во встроенных или драйверах.   -  person Martin James    schedule 06.09.2012
comment
@MartinJames: я скажу, что если нужно задать этот вопрос, совет по-прежнему Не делайте этого.   -  person Alok Save    schedule 06.09.2012


Ответы (1)


Можно и нужно написать так:

#include <cstdint>

uintptr_t p = 0x0001FBDC;
int value = *reinterpret_cast<int *>(p);

Обратите внимание, что если нет какой-либо гарантии, что p указывает на целое число, это поведение undefined. Стандартная операционная система уничтожит ваш процесс, если вы попытаетесь получить доступ к адресу, который она не ожидала от вас. Однако это может быть обычным явлением в автономных программах.

(В более ранних версиях C++ должны быть указаны #include <stdint.h> и intptr_t.)

person Kerrek SB    schedule 06.09.2012
comment
В этом случае есть ли разница между приведением в стиле c, которое использует OP, и reinterpret_cast? Я думаю, что последний просто распадается на первый в этом случае? - person Alok Save; 06.09.2012
comment
+1 за исправление несоответствия типов, но да, конечно, это будет работать (с вашей оговоркой относительно адресации, защиты управления памятью и т. д.), иначе указатели будут бесполезны! - person Martin James; 06.09.2012
comment
@Als: Скорее, актерский состав в стиле C распадается на reinterpret_cast. Значение приведений в стиле C в C++ определяется в терминах приведения типов в стиле C++ IIRC. Что касается компилятора, приведение в стиле C в C++ обычно является просто способом сказать, гм, я не уверен, какое приведение я хочу здесь, я выберу выбор шеф-повара. Я говорю «нормально», потому что думаю, что есть некоторые сомнительные вещи, которые вы можете делать с приведением в стиле C, но не с приведением в стиле C++: приведение от границы к производному к указателю на частную базу или что-то в этом роде. - person Steve Jessop; 06.09.2012
comment
@SteveJessop:True. В любом случае, дело в том, что в данном случае оба одинаковы, или есть что-то, что я пропустил, что делает reinterpret_cast лучше. - person Alok Save; 06.09.2012
comment
@Als: я не думаю, что ты что-то пропустил. - person Steve Jessop; 06.09.2012
comment
Почему intptr_t в более ранних версиях C++? intptr_t и uintptr_t были добавлены в стандарты одновременно. (С другой стороны, поскольку такие вещи, очевидно, не переносимы, вы можете пойти дальше и использовать unsigned, если это правильный размер. Или нет... Мне все равно нравится влияние uintptr_t на документацию.) - person James Kanze; 06.09.2012