C和64位指针计算

标签 c winapi pointers 64-bit driver

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

代码在 32 位上运行良好,但是当我在 amd64 中构建/运行时,我得到了奇怪的结果。我阅读了一些关于 64 位指针和寻址与 32 位与 16 位(在 win32 中)的内容,我确信我遗漏了一些关于 64 位体系结构中指针基础知识的内容。

这是在 32 位中运行良好的 C 代码。 ncImageLoadEventSettings.buff 是一个 char*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 位读取器应用程序是否存在问题?

最佳答案

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

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

关于C和64位指针计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10991905/

相关文章:

c++ - 在 Eclipse 中为 C 项目处理不同的构建场景

c - 使用 TCP 在 C 中发送两个字节

c++ - 调用 FindConnectionPoint 时访问冲突写入内存

winapi - 在 Win32 中显示带有 alpha channel 的 32 位图像

c - 如何使用 fread 和 fwrite 从文件中读取 pcm 样本?

C:扫描 While not EOF 循环意外结果

c++ - 检测 Windows (IE) 代理设置更改

c - 在C中,如何读取地址前的内存块

c - 无法理解从结构地址到 (uint *) 的指针转换

c++ - Boost智能指针和std智能指针有什么区别?