2011-12-05 54 views
1

不知道標題是否正確,但我相信問題在那裏。我有這段代碼:指針算法

FILE_DIRECTORY_INFORMATION *Buffer; 
Buffer = ExAllocatePoolWithTag (NonPagedPool, 4096, 'arK'); 
..<fill in data into the buffer>.. 
//Values here are: Buffer:0x81490000; NextEntryOffset:0x48 
Buffer += Buffer->NextEntryOffset; 
//Values here are: Buffer:0x81491440; NextEntryOffset:0x0 

問題是,代替簡單的添加,最後的代碼行執行乘法。新的Buffer值應該是(或者至少我希望它是:) 81490048,但是是81491440(81490000 + 48 * 48)。任何人都能解釋我爲什麼?

PS:我使用Windbg檢查了所有的值。使用VS11編譯,最後的代碼行真的被翻譯成imul指令。

回答

3

這就是C指針算法的工作原理。向指針添加'X'實際上意味着將指針X的大小加到起始內存位置。

我想你大概可以投到一個臨時的char *後面,但我想不出有什麼理由。

+0

明白了,所以基本上我只需要把它看作一個數字。投到char *做了詭計(最初我想BYTE,但它沒有在我的頭文件中定義)。驅動程序現在工作正常,該死的羞恥我沒有發現這個時候編寫用戶模式的應用程序:)謝謝。 – Kra

1

如果您有:

T *p; 
p += n; 

那麼這是(大約)等同於:

T *p; 
char *p2 = (char *)p; 
p2 += n * sizeof(T); 
p = (T *)p2; 

換句話說,編譯器有效地做乘法你。

1

當你給一個指針添加一個整數時,指針的值增加整數乘以指針指向的類型的大小。如果sizeof(FILE_DIRECTORY_INFORMATION)是48,那麼將一個指針加1會將其移動48,然後加2 - 乘2 * 48,等等。