我正在使用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
值... 最佳答案
这样思考:如果要取消引用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
也是我们应在cout
或printf
上打印的字符串。// 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值,则可能是地址之间的这种层次结构存在问题,我建议您严格调试内存,并查看创建指向指针的指针是否正确字符串的路径。