2011-09-19 14 views
5
std::cout << (DWORD)"test"; 

Si compilo y ejecuto esto obtengo valores de salida diferentes cada vez, pero no puedo entender por qué.¿Por qué obtengo un valor diferente en tiempo de ejecución cuando escribo una cadena en DWORD?

¿Alguna idea?

PD: Estoy usando Windows 7 de 64 bits y estoy compilando con Microsoft Visual C++ 2010 Ultimate.

+2

¿Y qué esperaba obtener de esto? –

+0

Es una cosa estúpida, pero una pregunta válida: no veo justificación para el voto a la baja. – Puppy

+0

Estoy aprendiendo a determinar una dirección base de proceso remota, que podría ser algo como '" pinball.exe "' - y, a mi entender, usar esto con compensaciones (digamos, para leer el puntaje de un juego) que usaría 'DWORD address = (DWORD)" pinball.exe "+ offset;' donde 'offset' podría ser algo así como' 0xFC' o lo que sea. – Purebe

Respuesta

4

"prueba", en su código, es efectivamente un puntero al comienzo de la cadena. Cuando lo lances a un DWORD, arrojas el puntero a un tipo entero y escribes ese número.

Como la ubicación de la memoria que está almacenando "prueba" puede cambiar con cada ejecución, el valor que verá cambiará.

+0

Oh ... Bueno, supongo que fue una obviedad bastante obvia de mi parte. ¡Gracias! – Purebe

+2

En cuanto a * por qué * la dirección de la constante de cadena (que proviene del segmento de datos estáticos del ejecutable) cambia con cada ejecución, es probable que se deba a [aleatoriedad de diseño del espacio de direcciones] (http://en.wikipedia.org/wiki/ Address_space_layout_randomization) (ASLR). –

2
std::cout << (DWORD)"test"; 

es equivalente a esto:

const char *tmp = "test"; 
std::cout << (DWORD)tmp; 

Es decir, se imprime la dirección después de la fundición en DWORD:

sería imprimir la misma valor, si lo hace también :

std::cout << (const void*)"test"; 
Cuestiones relacionadas