指针算术

时间:2011-12-05 17:13:07

标签: c

不确定标题是否正确,但我相信问题存在。我有这段代码:

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

问题在于,最后一个代码行不是简单地添加,而是执行乘法。新的缓冲区值应该是(或者至少我希望它是:) 81490048但是81491440(81490000 + 48 * 48)。谁能解释我为什么?

PS:我使用Windbg检查了所有值。使用VS11编译,最后的代码行真正被翻译成imul指令。

3 个答案:

答案 0 :(得分:3)

这就是指针运算在C中的工作原理。在指针中添加“X”实际上意味着将指针X的大小添加到起始内存位置。

我认为你可能会转向一个临时的char *然后回来,但我想不出一个理由。

答案 1 :(得分:1)

如果你有:

T *p;
p += n;

然后这(大致)相当于:

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

换句话说,编译器有效地为你做乘法。

答案 2 :(得分:1)

向指针添加整数时,指针的值会增加整数乘以指针所指向类型大小的值。如果sizeof(FILE_DIRECTORY_INFORMATION)为48,那么在指针中添加一个将其移动48,将2 - 乘以2 * 48,依此类推。