2015-05-07 74 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

相关问题