簡體   English   中英

在C / C ++中取消引用char指針?

[英]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("%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值,這可能是地址之間的這種層次結構的問題,我建議你嚴格調試內存,看看是否創建指針指針是正確的你的字符串的路徑。

是的,你需要取消引用兩個指針。 首先獲取保存char *的變量的地址,然后取消引用char *。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM