c# - IntPtr 和 Marshal.ReadIntPtr 有什么区别?

标签 c# marshalling intptr

我确实想了解以下之间的区别:

new IntPtr(pointer.ToInt64() + 0x4);

Marshal.ReadIntPtr(pointer + 0x4);

他们给出了不同的结果,但它做的不是同样的事情吗?

如果可能的话,您能否提供一个实际的例子来说明我对它的误解是什么?

最佳答案

IntPtr 基本上是特定于平台的整数。它在 32 位操作系统中是 32 位,在 64 位操作系统中是 64 位。它通常用于表示指针,但也可以表示任何随机整数。

所以你的两种方法做不同的事情。首先(IntPtr 构造函数)只接受您提供的任何数字并将其表示为 IntPtr。在这种情况下,IntPtr 是否为有效内存地址并不重要。

Marshal.ReadIntPtr 正在做不同的事情:它将您传递给它的任何内容都视为内存地址,然后转到该地址,从那里读取 4 或 8 个字节,然后返回 IntPtr 表示该数据。

试试这个来验证:

IntPtr pointer = IntPtr.Zero;
var anotherPointer = new IntPtr(pointer.ToInt64() + 0x4);
var yetAnother = Marshal.ReadIntPtr(pointer + 0x4);

这会在第三行抛出内存访问冲突异常,因为你通常不能读取这么低地址(0x4)的内存。然而,第二行只是返回您传递到那里的任何内容 (4) 作为 IntPtr

关于c# - IntPtr 和 Marshal.ReadIntPtr 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42294817/

相关文章:

c# - 对预检请求的响应未通过访问控制检查(Angular2)

c# - 如何将此示例 foreach 转换为 lambda 表达式?

xml - Golang 更改 float 的 xml 编码格式

java - 使用 @XmlRootElement 注释类是否会降低性能?

c# - 从 C# 函数在 C++ COM dll 中传递字符串

c# - gdip 图像直接在我的本地驱动器中保存 intptr

c# - 为什么未指定操作名称时不调用索引方法

c# - 当 ValueType 被声明为类的一部分时是否会被装箱?

java - 使用 rmi 时的编码问题

c# - 判断 IntPtr 是指向托管内存还是非托管内存