我有一字符串打印輸出到屏幕上一個C++代碼,就像這樣:的Visual Studio - 獲取第一個字符的內存地址字符串
cout << "Hello, World" << endl
我需要做的是,使用Visual Studio內存反彙編程序,找到該字符串文字(「你好,世界」)中的第一個字符的內存地址(在這種情況下,字母'H',和最後一個)
我該怎麼做?
謝謝。
我有一字符串打印輸出到屏幕上一個C++代碼,就像這樣:的Visual Studio - 獲取第一個字符的內存地址字符串
cout << "Hello, World" << endl
我需要做的是,使用Visual Studio內存反彙編程序,找到該字符串文字(「你好,世界」)中的第一個字符的內存地址(在這種情況下,字母'H',和最後一個)
我該怎麼做?
謝謝。
您可以用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個相同的字符串文本,因此它只爲一個內存分配內存)。
您可以使用一點點的組裝。接下來的代碼與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");
結果將是這樣的:
你爲什麼要這樣做?字符串文字存儲在不可寫入的內存中。 – vsoftco
只是爲了好玩,因爲我在學習彙編語言 –
請注意,大多數操作系統在每次執行時都不會在同一地點加載數據。通常,地址是相對的或虛擬的。對於相對地址,加載器將在可執行文件加載到內存時解析它們。總之,每次地址不會是相同的值。 –