2016-07-03 8 views
3

Ich lerne immer noch C++ und habe Stunden damit verbracht, herauszufinden, wie man ein Byte an einer bestimmten Speicheradresse speichern kann. In meinem Fall sind ALLE (gut, fast alle) Speicheradressen nicht dynamisch - also Adressen, auf die verwiesen wird Zum Beispiel ändern sich die Variablen nicht.Byte von der Speicheradresse holen?

Also versuche ich ein einzelnes Byte abzurufen, das an einer bekannten Speicheradresse gespeichert ist. Sagen wir zum Beispiel: 0x20000

das Byte, das ich abzurufen versuche, ist zum Beispiel 0xEF.

Nun, wie würde ich das Byte abrufen, ohne den Dereferenzoperator zu verwenden? Also im Grunde muss ich 0xEF bekommen, ohne zu deklarieren, welche Art von Datentyp es ist, wie buchstäblich nur physikalisch erhalten das Byte 0xEF. Hoffentlich macht das Sinn, ich bin ein ziemlich noob:/

+1

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

+0

Wenn Sie sagen, '0xEF' ist, dass der Offset vom Speicherplatz '0x20000'? – Galik

+0

Wenn Galik korrekt ist, dann füge '0xef' zu dem Ausdruck hinzu, den ich vorher gepostet habe. – md5i

Antwort

3

Nun, wie würde ich das Byte ohne den Dereferenzoperator abrufen?

Sie können dies nicht ohne Dereferenzierung der Adresse, auf die zugegriffen wird. Der kleinste Datentyp, den Sie adressieren können, ist char. Für Bytes wird normalerweise ein typedef unsigned char uint8_t verwendet.

Also müssen Sie die Speicheradresse mit einem reinterpret_cast<uint8_t*>(addr) und Dereferenzierung zugreifen, um den Wert zu erhalten.

1

Die einzige Möglichkeit, den Byte-Wert zu ermitteln, ist die Dereferenzierung der Speicheradresse.

typecasting die Speicheradresse auf einen typisierten Zeiger und dereferencing dann ist es die direkte Weise, zum Beispiel:

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

jedoch Ihre Frage zu beantworten:

wie würde ich abrufen das Byte ohne den Dereferenzoperator zu verwenden?

Sie können dereferenzieren den Speicher indirekt durch memcpy() oder eine ähnliche Funktion, zB:

#include <cstring> 

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