我尝试实现以下目标:我有一个指向地址的指针p
,该地址再次保存一个地址(该地址也是一个有效地址)。现在我想要另一个指向pp
地址的指针,它是p
. 所以我正在做以下事情:
// Retrieve the start address
unsigned long long *p = getInitialAddress();
// Let pp point to next address
unsigned long long *pp = (unsigned long long*)(*p);
// Print address
printf("0x%llx %p\n", *p, pp);
例如,这将打印:0x7fffedc47a70 0x7fffedc47a70
这是所需的结果。
但是,将另一个printf
放入代码中,如下所示:
// Retrieve the start address
unsigned long long *p = getInitialAddress();
// Print
printf("%p 0x%llx\n", p, *p);
// Let pp point to next address
unsigned long long *pp = (unsigned long long*)(*p);
// Print address
printf("0x%llx %p\n", *p, pp);
导致:
0x7fffacea3660 0x7fffacea3680
0x0 (nil)
这不是正确的结果,因为它应该是
0x7fffacea3660 0x7fffacea3680
0x7fffacea3680 0x7fffacea3680
那么printf
指针中的内容是否有所改变或有什么问题?
编辑:完整代码
unsigned long long* readRBP();
int main(void) {
// Retrieve the start address
unsigned long long *p = readRBP();
// Print
printf("%p 0x%llx\n", p, *p);
// Let pp point to next address
unsigned long long *pp = (unsigned long long*)(*p);
// Print address
printf("0x%llx %p\n", *p, pp);
return 0;
}
unsigned long long* readRBP() {
unsigned long long rbp;
__asm__ volatile("mov %%rbp, $0" : "=r"(rbp));
return (unsigned long long*)rbp;
}
这将获得 rbp(堆栈基指针)。这个指针的内容就是指向下一个rbp的指针,以此类推。这个rbp 来自readRBP()
它自己,下一个 rbp 属于,main
main 之后的下一个是0x0
,即最开始。