2012-09-25 41 views
2

我正在使用DWARF和ELF信息的程序中工作。我使用称为Pin的工具连接到另一个程序。我从“Y”程序中声明的全局变量中获取地址,并将其挂接到我将调用“X”的Pin模块中。取消引用C/C++中的字符指针?

我得到了这些全局变量的一堆地址。不幸的是,当我尝试解除引用时,我遇到了麻烦。例如(现在我手工做的事情,看看它是做什么应该做的):

char * limit, * address1; 

for(address1 = (char *) 0x804A040, limit = address1 + bytesize; address1 < limit; address1++) 
     cout << *(address1) << "\n"; 

我应该得到存储在该地址的变量,它是一个char *一个字。在这种情况下,我必须解除引用两个指针吗?地址,然后char *存储在该地址?

时,我想提领的int变量这工作完全正常,但每当我试图取消引用字符指针或可变我得到non-ASCII值...

+0

您的'for'语句只有两个以分号分隔的参数,但需要三个才能生效。 – mrb

+0

您是否期望打印字符串或字符串本身的地址? –

+0

您是否正在尝试从*当前进程*或一个单独进程*读取数据? –

回答

4

这样想:如果要提领的int,您使用int *

int *addr = (int *)0x12345678; 
printf("%d\n", *addr); 

但字符串已经是一个指针,因此,如果你这样做:

char *addr = (char *)0x12345678; 

你不不需要将其解除引用以便将其打印出来,因此您可以这样得到它:

printf("%s\n", addr); 

此外,假设你有这样的记忆:

00000001: 0x12345678 
... 
12345678: 'A' 
12345679: 'B' 
1234567A: '\0' 
... 

让我们访问地址0x00000001,看看我们能做些什么:

unsigned int *addr = (unsigned int *)0x00000001; 

现在*addr持有整数这是第一个地址我们的字符串的字符。带有字符串参数的函数通常会询问字符串地址,即指向它的指针,因此*addr也是我们应该在coutprintf上打印的字符串。现在

// This should print "AB" 
printf("%s\n", (char *)(*addr)); 

如果取消引用我们的价值(0x12345678),我们会得到字符串的第一个字符,只有它,作为一个char。因此,如果您滥用它并将其解引用到char *,printf将试图搜索内存'A',这是0x00000041,并且可能会出现分段错误。

所以,正确的方式提领其价值,得到第一个字符是这样的:

// This should print "A" 
printf("%c\n", (char)(**addr)); 

所以,作为一个结论,如果你仍然得到非ASCII值,这可能是一个问题这种地址之间的层次结构,我建议你严格调试内存,看看创建一个指针指针是你的字符串的正确路径。

+0

我认为这样做,但我得到了一个分段错误做它..我有访问该虚拟内存空间,所以我不知道为什么我得到它.. – attis

+0

更新了答案,检查是否可行。 –

+0

这更有意义!但是,我不断收到非ASCII值.. – attis

2

是,您需要取消引用两个指针。首先获取包含char *的变量的地址,然后解引用char *。