繁体   English   中英

在C / C ++中取消引用char指针?

[英]Dereferencing a char pointer in C/C++?

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

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

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也是我们应该在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值,这可能是地址之间的这种层次结构的问题,我建议你严格调试内存,看看是否创建指针指针是正确的你的字符串的路径。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM