IntPtr和Marshal.ReadIntPtr有什么区别?

时间:2017-02-17 09:57:39

标签: c# marshalling intptr

我想了解之间有什么区别:

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

Marshal.ReadIntPtr(pointer + 0x4);

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

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

1 个答案:

答案 0 :(得分:1)

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

相关问题