C和64位指针计算

时间:2012-06-12 07:06:25

标签: c winapi pointers 64-bit driver

我正在做一个内核模式驱动程序,在64位上运行代码时遇到了一些错误。

代码在32位上运行良好,但是当我在amd64中构建/运行时,我得到了奇怪的结果。我读了一些关于64位指针和寻址与32位对比16位(在win32中)并且我确定我遗漏了关于64位架构中指针基础的东西。

这是在32位中运行良好的C代码。 ncImageLoadEventSettings.buffchar*ncILHead->count只是一个int。

// Calculate offset
    pnt = (void*)(ncImageLoadEventSettings.buff + sizeof(struct NC_IL_HEAD) + (ncILHead->count * sizeof(struct NC_IL_INFO)));

此代码计算将结构对象写入缓冲区的地址(从.buff开始),在32位模式下完全正常。

应该注意,读取此缓冲区的程序是32位。我想我读到的地方是64位模式下的结构与32位模式下结构不同。

32位读取器程序读取一些缓冲区的内容就好了,而大多数条目都是垃圾。

这是计算地址的正确方法,还是读取该缓冲区的64位与32位读取器应用程序存在问题?

1 个答案:

答案 0 :(得分:1)

请参阅http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86

通常,指针较大(64位),大多数64位大小的字段(包括指针)将对齐(添加填充)。