2015-05-07 60 views
0

我有一字符串打印輸出到屏幕上一個C++代碼,就像這樣:的Visual Studio - 獲取第一個字符的內存地址字符串

cout << "Hello, World" << endl 

我需要做的是,使用Visual Studio內存反彙編程序,找到該字符串文字(「你好,世界」)中的第一個字符的內存地址(在這種情況下,字母'H',和最後一個)

我該怎麼做?

謝謝。

+0

你爲什麼要這樣做?字符串文字存儲在不可寫入的內存中。 – vsoftco

+0

只是爲了好玩,因爲我在學習彙編語言 –

+0

請注意,大多數操作系統在每次執行時都不會在同一地點加載數據。通常,地址是相對的或虛擬的。對於相對地址,加載器將在可執行文件加載到內存時解析它們。總之,每次地址不會是相同的值。 –

回答

1

您可以用cout(不知道如何直接拆裝做)

std::cout << (void*)"Hello, World"; 

或者,如果你需要存儲字符串文字打印地址,

const char* str = "Hello, World"; 
std::cout << (void*)str; 

全部示例Live on Ideone

#include <iostream> 

int main() 
{ 
    const char* ptr = "Hello, World"; 
    std::cout << (void*)ptr << std::endl; 
    std::cout << (void*)"Hello, World" << std::endl; 
} 

正如您在運行示例中看到的,字符串文字"Hello, World"char* str = "Hello, World"實際上使用的是相同的內存(編譯器足夠聰明,可以實現2個相同的字符串文本,因此它只爲一個內存分配內存)。

0

您可以使用一點點的組裝。接下來的代碼與Visual Studio 2010中創建C++控制檯項目:

void first_char (char * mystr) { 
short datas; 
int addr; 
printf("The string is : %s\n",mystr); 
__asm { mov ax, ds  ;GET DATA SEGMENT. 
     mov datas, ds  
     lea esi, mystr ;GET STRING OFFSET. 
     mov addr, esi 
     } 
printf("Its address is : %d:%d",datas,addr); 
} 

這是你如何可以調用以前的方法:

first_char("Hello, World"); 

結果將是這樣的:

enter image description here

相關問題