私は次のことを達成しようとしています: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 の後の次の rbp は0x0
です。つまり、まさに最初です。