2015-02-06 69 views
0

不是很專業。與C++。我一直在努力的代碼是:https://msdn.microsoft.com/en-us/library/windows/desktop/ee175819(v=vs.85).aspx減去LPVOID

我的問題存在於這個區域:

_tprintf(TEXT(" Data portion begins at: %#p\n Size: %d bytes\n") \ 
      TEXT(" Overhead: %d bytes\n Region index: %d\n\n"), 
      Entry.lpData, 
      Entry.cbData, 
      Entry.cbOverhead, 
      Entry.iRegionIndex); 
} 

我現在面臨的問題是,該Entry.lpData是數據部分的地址堆塊。我想在Entry.lpData地址之前讀取8個字節。所以,當我只是從Entry.lpData減去8,並試圖讀取的字節,我得到了錯誤

hexDump(entry.lpData - 8, 8); 


heapwalk.cpp(119): error C2036: 'PVOID' : unknown size 

回答

2

指針到void的指針什麼,所以它是沒有意義的執行指針運算直接在他們身上。在這種情況下,因爲你知道你需要一個8字節的偏移量,所以你首先簡單地將它轉換爲char*。在一般情況下,您會知道它實際指向的數據類型,並將其轉換爲該類型的指針。

char *p = static_cast<char*>(entry.lpData) - 8; 

這工作,因爲char*是一個例外the strict aliasing rule。不要嘗試使用任意類型。

+0

像這樣 - > unsigned char * p =(unsigned char *)address; ? – 2015-02-06 20:01:18

+0

@DavidA。,C++類型轉換更好,'char *'很好。 'static_cast (lpData) - 8'。請注意,8是一個幻數,應該用解釋8實際所做的事情來代替。 – chris 2015-02-06 20:02:23

+0

@DavidA .:我添加了一個例子 – 2015-02-06 20:04:12