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

Jeśli skompiluję i uruchomię to, za każdym razem otrzymuję różne wartości wyjściowe, ale nie wiem, dlaczego.Dlaczego otrzymuję inną wartość w czasie wykonywania, gdy typ rzuca ciąg do DWORD?

Wszelkie pomysły?

PS: Używam 64-bitowego systemu Windows 7 i kompiluję się z Microsoft Visual C++ 2010 Ultimate.

+2

A czego się spodziewałeś, aby z tego zrezygnować? –

+0

To głupia rzecz, ale ważne pytanie - nie widzę uzasadnienia dla przegłosowania. – Puppy

+0

Dowiaduję się o określeniu zdalnego adresu bazowego procesu, który może być czymś takim jak '" pinball.exe "' - i do mojego zrozumienia, aby użyć tego z offsetami (np. Odczytać wynik gry), których użyłbyś 'DWORD address = (DWORD)" pinball.exe "+ offset;' gdzie 'offset' może być czymś w rodzaju' 0xFC' lub cokolwiek innego. – Purebe

Odpowiedz

4

"Test", w kodzie, jest skutecznie wskaźnikiem do początku łańcucha. Po przesłaniu go do obiektu DWORD rzutowanie wskaźnika na typ całkowity i zapisanie tego numeru.

Ponieważ miejsce w pamięci, które zapisuje "test", może się zmienić przy każdym uruchomieniu, zmieni się wyświetlana wartość.

+0

Och ... cóż, to był chyba oczywisty przesadny widok z mojej strony. Dzięki! – Purebe

+2

Co do * dlaczego * adres stałej łańcuchowej (która pochodzi z segmentu danych statycznych pliku wykonywalnego) zmienia się przy każdym uruchomieniu, prawdopodobnie wynika to z [Randomizacji układu przestrzeni adresowej] (http://en.wikipedia.org/wiki/ Address_space_layout_randomization) (ASLR). –

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

jest odpowiednikiem tego:

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

Oznacza to, że drukuje adres po odlaniu go do DWORD:

Byłoby wydrukować samą wartość, jeśli to zrobić także :

std::cout << (const void*)"test"; 
Powiązane problemy