2012-09-25 80 views
2

我正在使用DWARF和ELF信息的程序中工作。我使用稱爲Pin的工具連接到另一個程序。我從「Y」程序中聲明的全局變量中獲取地址,並將其掛接到我將調用「X」的Pin模塊中。取消引用C/C++中的字符指針?

我得到了這些全局變量的一堆地址。不幸的是,當我嘗試解除引用時,我遇到了麻煩。例如(現在我手工做的事情,看看它是做什麼應該做的):

char * limit, * address1; 

for(address1 = (char *) 0x804A040, limit = address1 + bytesize; address1 < limit; address1++) 
     cout << *(address1) << "\n"; 

我應該得到存儲在該地址的變量,它是一個char *一個字。在這種情況下,我必須解除引用兩個指針嗎?地址,然後char *存儲在該地址?

時,我想提領的int變量這工作完全正常,但每當我試圖取消引用字符指針或可變我得到non-ASCII值...

+0

您的'for'語句只有兩個以分號分隔的參數,但需要三個才能生效。 – mrb

+0

您是否期望打印字符串或字符串本身的地址? –

+0

您是否正在嘗試從*當前進程*或一個單獨進程*讀取數據? –

回答

4

這樣想:如果要提領的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值,這可能是一個問題這種地址之間的層次結構,我建議你嚴格調試內存,看看創建一個指針指針是你的字符串的正確路徑。

+0

我認爲這樣做,但我得到了一個分段錯誤做它..我有訪問該虛擬內存空間,所以我不知道爲什麼我得到它.. – attis

+0

更新了答案,檢查是否可行。 –

+0

這更有意義!但是,我不斷收到非ASCII值.. – attis

2

是,您需要取消引用兩個指針。首先獲取包含char *的變量的地址,然後解引用char *。