2012-09-06 18 views
5

Me preguntaba si es posible hacer algo como esto:C++ - Obtener el valor de una dirección de memoria particular

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

Significado, es posible obtener el valor de una dirección particular en la memoria?

Gracias

+3

no ¿Acaba probado todavía? –

+2

¿Qué desea hacer con la dirección si puede obtenerla? Consejo: no lo hagas –

+0

@Als - inevitable a veces, esp. en integrados o controladores. –

Respuesta

14

Usted puede y debe escribir así:

#include <cstdint> 

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

Tenga en cuenta que a menos que haya alguna garantía de que p apunta a un número entero, este es un comportamiento indefinido. Un sistema operativo estándar matará su proceso si intenta acceder a una dirección que no esperaba que abordara. Sin embargo, esto puede ser un patrón común en los programas autónomos.

(versiones anteriores de C++ deben decir #include <stdint.h> y intptr_t.)

+0

En este caso, ¿hay alguna diferencia entre el elenco de estilo c que usa OP y el 'reinterpret_cast'? Creo que este último simplemente se descompone a la primera en este caso? –

+0

+1 para corregir los desajustes de tipos, pero sí, por supuesto, funcionará (con la capacidad de direccionamiento, las protecciones de administración de memoria, etc.), ¡de lo contrario los punteros serían inutilizables! –

+0

@Als: Más bien, el elenco de estilo C decae al 'reinterpret_cast'. El significado de los moldes de estilo C en C++ se define en términos del estilo C++ moldes IIRC. En lo que respecta al compilador, un molde de estilo C en C++ normalmente es solo una forma de decir: "um, no estoy seguro de qué molde elegir aquí, tomaré la decisión del chef". Digo normalmente porque creo que hay algunas cosas dudosas que puedes hacer con un elenco de estilo C pero no con los moldes de estilo C++: casting bounder-to-derived a puntero-a-base-privada o algo así. –

Cuestiones relacionadas