我嘗試實現以下操作:我有一個指針p
指向一個地址(該地址也是一個有效地址)。現在我想有另一個指針pp
指向p
的內容地址。所以我做了以下內容:在printf後將變量的內容變量賦值爲NULL
// 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
,下一個主要是0x0
,即。即一開始。
您應該在'printf'格式字符串中使用'%p'來打印指針。 – 2012-04-14 15:10:41
但是我正在打印指針的內容,不是嗎? – 2012-04-14 15:12:41
很難相信這真的是你的代碼。如何完成這樣的程序? – 2012-04-14 15:16:16