IntPtr 和 Marshal.ReadIntPtr 有什么区别?
What is the difference between IntPtr and Marshal.ReadIntPtr?
我很想了解这两者之间的区别:
new IntPtr(pointer.ToInt64() + 0x4);
和
Marshal.ReadIntPtr(pointer + 0x4);
他们给出了不同的结果,但它不是做同样的事情吗?
如果可以的话,您能否提供一个实际的例子来说明我对它的误解是什么?
IntPtr
基本上是 platform-specific 整数。在 32 位 OS 中是 32 位,在 64 位 OS 中是 64 位。它通常用于表示指针,但也可以表示任何随机整数。
所以你的两种方法做不同的事情。首先(IntPtr
构造函数)只接受您提供的任何数字并将其表示为 IntPtr
。在这种情况下,IntPtr
是否是有效内存地址并不重要。
Marshal.ReadIntPtr
正在做不同的事情:它将您传递给它的任何内容视为内存地址,然后转到该地址,从那里读取 4 或 8 个字节,然后 returns IntPtr
表示该数据。
试试这个来验证:
IntPtr pointer = IntPtr.Zero;
var anotherPointer = new IntPtr(pointer.ToInt64() + 0x4);
var yetAnother = Marshal.ReadIntPtr(pointer + 0x4);
这会在第三行抛出内存访问冲突异常,因为你通常不能读取这么低地址(0x4)的内存。然而,第二行只是 returns 无论你在那里传递什么 (4) 作为 IntPtr
.
我很想了解这两者之间的区别:
new IntPtr(pointer.ToInt64() + 0x4);
和
Marshal.ReadIntPtr(pointer + 0x4);
他们给出了不同的结果,但它不是做同样的事情吗?
如果可以的话,您能否提供一个实际的例子来说明我对它的误解是什么?
IntPtr
基本上是 platform-specific 整数。在 32 位 OS 中是 32 位,在 64 位 OS 中是 64 位。它通常用于表示指针,但也可以表示任何随机整数。
所以你的两种方法做不同的事情。首先(IntPtr
构造函数)只接受您提供的任何数字并将其表示为 IntPtr
。在这种情况下,IntPtr
是否是有效内存地址并不重要。
Marshal.ReadIntPtr
正在做不同的事情:它将您传递给它的任何内容视为内存地址,然后转到该地址,从那里读取 4 或 8 个字节,然后 returns IntPtr
表示该数据。
试试这个来验证:
IntPtr pointer = IntPtr.Zero;
var anotherPointer = new IntPtr(pointer.ToInt64() + 0x4);
var yetAnother = Marshal.ReadIntPtr(pointer + 0x4);
这会在第三行抛出内存访问冲突异常,因为你通常不能读取这么低地址(0x4)的内存。然而,第二行只是 returns 无论你在那里传递什么 (4) 作为 IntPtr
.