gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:53:06 26 4
gpt4 key购买 nike

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

关于c++ - 在 C/C++ 中取消引用 char 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com