2

我正在使用 DWARF 和 ELF 信息的程序工作。我使用名为 Pin 的工具迷上了另一个程序。我有来自“Y”程序中声明的全局变量的地址,并将其连接到我将称为“X”的 Pin 模块中。

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

char * limit, * address1;

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

我应该得到存储在那个地址中的变量,它是char *一个单词。在这种情况下我是否必须取消引用两个指针?地址,然后char *存储在该地址中?

当我想取消引用一个变量时,这工作得很好int,但是每当我尝试取消引用一个 char 指针或变量时,我都会得到non-ASCII值......

4

2 回答 2

7

像这样想:如果你想取消引用 an 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. 因此,如果您滥用它并将其取消引用到 a char *printf将尝试搜索内存“A”,即0x00000041,并且可能会出现分段错误。

因此,取消引用其值以获取第一个字符的正确方法是:

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

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

于 2012-09-25T20:14:24.933 回答
2

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

于 2012-09-25T20:13:36.353 回答