2011-12-05 55 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,等等。