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

如果我編譯並運行這個,我會得到不同的輸出值,但我不明白爲什麼。爲什麼在將字符串類型轉換爲DWORD時在運行時會得到不同的值?

任何想法? PS:我正在使用Windows 7 64位,並且正在使用Microsoft Visual C++ 2010 Ultimate編譯。

+2

你期望從中得到什麼? –

+0

這是一個愚蠢的事情,但一個有效的問題 - 沒有看到downvote的理由。 – Puppy

+0

我正在學習如何確定一個遠程過程基地址,這個地址可能是''pinball.exe''',並且我的理解是使用這個偏移量(比如說讀一個遊戲的分數)來使用它'DWORD address =(DWORD)「pinball.exe」+ offset;'其中'offset'可能是沿着'0xFC'或其他什麼的。 – Purebe

回答

4

在您的代碼中,「test」實際上是指向字符串開頭的指針。當你將它轉換爲DWORD時,將指針轉換爲整數類型,並寫出該數字。

由於存儲「測試」的內存位置可能隨着每次運行而改變,因此您看到的值將會改變。

+0

哦......好吧,我認爲這是一個非常明顯的超視距。謝謝! – Purebe

+2

至於*爲什麼*字符串常量(來自可執行文件的靜態數據段)的地址隨着每次運行而改變,這可能是由於[地址空間佈局隨機化](http://en.wikipedia.org/wiki/ Address_space_layout_randomization)(ASLR)。 –

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

是相同的:

這將打印相同,如果你這樣做也:

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

也就是說,它鑄造成DWORD後打印地址:

std::cout << (const void*)"test"; 
相關問題