2012-09-06 4 views
5

Ich habe mich gefragt, ob es möglich, so etwas zu tun ist:C++ - Get Wert einer bestimmten Speicheradresse

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

Bedeutung, ist es möglich, den Wert einer bestimmten Adresse im Speicher zu bekommen?

Dank

+3

Hast du nicht gerade versucht es noch? –

+2

Was möchten Sie mit der Adresse machen, wenn Sie es bekommen können? Tipp: Tu es nicht. –

+0

@Als - unvermeidlich manchmal, esp. in eingebetteten oder Treibern. –

Antwort

14

Sie können und es so schreiben sollte:

#include <cstdint> 

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

Beachten Sie, dass es sei denn, es gibt einige Garantie, dass p Punkte auf eine ganze Zahl, diese undefinierten Verhalten ist. Ein Standardbetriebssystem wird Ihren Prozess beenden, wenn Sie versuchen, auf eine Adresse zuzugreifen, die Sie nicht erwartet haben. Dies kann jedoch ein häufiges Muster in freistehenden Programmen sein.

(Frühere Versionen von C++ sollte #include <stdint.h> und intptr_t sagen.)

+0

In diesem Fall gibt es einen Unterschied zwischen der C-Style-Besetzung, die OP verwendet, und dem 'reininterpret_cast'? Ich denke, letzterer fällt in diesem Fall einfach auf den ersteren ab? –

+0

+1 für die Festsetzung der Typ-Mismatches, aber ja, natürlich wird es funktionieren, (mit Ihrer Einschränkung re. Adressierbarkeit, Speicher-Management-Schutz etc.), sonst Zeiger wäre nicht nutzbar! –

+0

@Als: Vielmehr verfällt der C-Style Cast zum 'reinterpret_cast'. Die Bedeutung von C-Style-Umwandlungen in C++ wird in Form der C++ - artigen Umwandlungen IIRC definiert. Was den Compiler betrifft, ist eine C-Style-Besetzung in C++ normalerweise nur eine Art zu sagen: "Ähm, ich bin mir nicht sicher, welche Besetzung ich hier haben will, ich nehme die Wahl des Chefs". Ich sage normalerweise, weil ich denke, dass es einige dubiose Dinge gibt, die man mit einer C-Style-Cast machen kann, aber nicht mit C++ - Style-Casts: Casting Bounder-zu-abgeleitet zu Pointer-zu-Private-Base oder so. –