在C/C++中取消对字符指针的引用
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("%dn", *addr);
但是字符串已经是一个指针,所以如果你这样做:
char *addr = (char *)0x12345678;
你不需要取消引用它就可以打印出来,所以你可以这样得到:
printf("%sn", addr);
此外,假设您有以下内存:
00000001: 0x12345678
...
12345678: 'A'
12345679: 'B'
1234567A: ' '
...
让我们访问地址0x00000001
,看看我们能做些什么:
unsigned int *addr = (unsigned int *)0x00000001;
现在*addr
保存一个整数,它是我们字符串的第一个字符的地址。采用字符串参数的函数通常要求字符串地址,即指向它的指针,因此*addr
也是我们应该在cout
或printf
上打印的字符串。
// This should print "AB"
printf("%sn", (char *)(*addr));
现在,如果取消引用我们的值(0x12345678
),我们将获得字符串的第一个字符,并且只有它,作为char
。因此,如果您滥用它并将其取消引用到char *
,printf
将尝试搜索内存"a",即0x00000041
,并且可能会出现分段错误。
因此,取消引用其值以获得第一个字符的正确方法是:
// This should print "A"
printf("%cn", (char)(**addr));
因此,作为一个结论,如果你仍然得到非ASCII值,这可能是地址之间这种层次结构的问题,我建议你严格调试内存,看看创建指向指针的指针是否是指向字符串的正确路径。
是的,您需要取消引用两个指针。首先获取保存char*的变量的地址,然后取消对char*的引用。
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 字符指针的 Qt 数组
- C++将常量字符* 指针数组传递给对象
- 为什么不能将字符指针定义为数组?
- 在函数内初始化无符号字符指针将返回空指针
- 将字符指针存储到容器中
- 为什么 strtok_r() 只接受字符数组而不接受字符指针
- 字符指针数组内存分配
- 字符指针不递增?
- 如何在C++中使用字符指针
- 确保字符指针始终指向相同的字符串文字
- C++中的字符指针
- 使用unique_ptr的常量字符指针
- 字符指针不断意外更改
- 将字符指针中的十六进制转换为十进制
- 如何将字符*(字符指针)转换为 PCSZ?
- 在向量中存储字符指针
- 字符指针具有不同的值