不确定标题是否正确,但我相信问题存在。我有这段代码:
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指令。
答案 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,依此类推。