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

Se compilo ed eseguo questo ottengo diversi valori di output ogni volta, ma non riesco a capire perché.Perché ottengo un valore diverso in fase di esecuzione quando si digita una stringa su DWORD?

Qualche idea?

PS: sto usando Windows 7 a 64 bit e sto compilando con Microsoft Visual C++ 2010 Ultimate.

+2

E cosa ti aspettavi di uscire da questo? –

+0

È una cosa stupida da fare, ma una domanda valida: non vedere la giustificazione per il downvote. – Puppy

+0

Sto imparando a determinare un indirizzo di base del processo remoto, che potrebbe essere qualcosa come "" pinball.exe "' - e alla mia comprensione di usare questo con offset (ad esempio per leggere lo score di un gioco) che useresti 'DWORD address = (DWORD)" pinball.exe "+ offset;' dove 'offset' potrebbe essere qualcosa sulla falsariga di' 0xFC' o altro. – Purebe

risposta

4

"test", nel codice, è effettivamente un puntatore all'inizio della stringa. Quando lo lanci su un DWORD, lanci il puntatore a un tipo intero e scrivi quel numero.

Poiché la posizione di memoria che sta memorizzando "test" può cambiare ad ogni corsa, il valore visualizzato cambierà.

+0

Oh .... beh, quella era una visione piuttosto ovvia da parte mia, suppongo. Grazie! – Purebe

+2

Per quanto riguarda * perché * l'indirizzo della costante di stringa (che proviene dal segmento di dati statici dell'eseguibile) cambia ad ogni esecuzione, è probabilmente dovuto a [randomizzazione del layout dello spazio dell'indirizzo] (http://en.wikipedia.org/wiki/ Address_space_layout_randomization) (ASLR). –

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

è equivalente a questo:

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

Cioè, si stampa l'indirizzo dopo la fusione in DWORD:

Si sarebbe stampare la stessa valore, se si esegue questa operazione anche :

std::cout << (const void*)"test"; 
Problemi correlati