2017-08-13 6 views
-1

J'essaie l'approche suivante pour convertir une poignée d'annuler * puis revenir à la si je fais ça, gérer de la manière suivanteConversion uint64_t à void * et le dos

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 

Cependant, je suis en mesure de récupérer le hInt:

uint64_t hIntBack = reinterpret_cast<uint64_t>(hPoint) 

Je ne suis pas sûr que je comprends la différence entre les deux approches.

+0

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

+0

Question similaire à https://stackoverflow.com/questions/45657427/access-violation-casting-to-void-and-back –

Répondre

1

Dans ce code:

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

Vous cherchez réellement à la valeur à l'emplacement de mémoire hPoint. C'est parce que vous le convertissez en uint64_t *, puis en saisissant la valeur à cet emplacement. En outre, si uint64_t fonctionne très bien avec les machines 64 bits, la méthode standard consiste à utiliser uintptr_t, qui aura la taille d'un pointeur pour l'architecture que vous compilez. Si vous deviez compiler le code avec uintXX_t sur une machine non XX bits, le compilateur apportera une erreur