2017-08-13 1 views
-1

ich folgenden Ansatz versuchen einen Griff zu konvertieren * für ungültig zu erklären und dann zurück in den Griff die folgende Art und WeiseKonvertieren uint64_t zu void * und zurück

uint64_t hInt = 154071804376; //assume this is a valid memory location 

void* hPoint = reinterpret_cast<void*>(hInt); 

uint64_t hIntBack = *static_cast<uint64_t*>(hPoint); unable to recover hInt here, getting some other number 140727986249696 

Allerdings, wenn ich das tue, ich bin in der Lage zu zurückzufordern hInt:

uint64_t hIntBack = reinterpret_cast<uint64_t>(hPoint) 

ich nicht sicher bin ich den Unterschied zwischen den beiden Ansätzen verstehen.

+0

'void * HRichten = reinterpret_cast (Hint);' => 'void * HRichten = reinterpret_cast (&hInt);' – user0042

+0

Ähnliche Frage zu https://stackoverflow.com/questions/45657427/access-violation-casting-to-void-and-back –

Antwort

1

In diesem Code:

uint64_t hIntBack = *static_cast<uint64_t*>(hPoint); unable to recover hInt here, getting some other number 140727986249696 

Sie sind tatsächlich auf dem Wert an der Speicherstelle hPoint suchen. Dies liegt daran, dass Sie es in eine uint64_t * konvertieren und dann den Wert an dieser Stelle erfassen.

Als Nebenbemerkung, während uint64_t für 64-Bit-Maschinen funktioniert, ist die Verwendung von uintptr_t die Standardmethode, die garantiert die Größe eines Zeigers für die Architektur, für die Sie kompilieren, ist. Wenn Sie den Code mit uintXX_t auf einer nicht XX-Bit-Maschine zu kompilieren sind, wird der Compiler einen Fehler bringen

Verwandte Themen