【问题标题】:Can I convert a value of IntPtr to another IntPtr without unsafe in C#?我可以在 C# 中将 IntPtr 的值转换为另一个不安全的 IntPtr 吗?
【发布时间】:2019-03-07 08:37:39
【问题描述】:

假设我有一个 IntPtr,它是从本机代码获取的 void**。当我打算将它遵从 void* 等价 IntPtr 时,我使用了这样的代码:

unsafe
{
    var innerPtr = (IntPtr)outerPtr.ToPointer();
}

为此,我需要启用unsafe 代码。我想知道是否有另一种方法可以转换这种指针没有不安全?


更新:

对不起,我的问题无效。 (IntPtr)outerPtr.ToPointer() 的用法没有意义。

【问题讨论】:

  • IntPtr 不知道它指向什么——它只是封装了一个内存地址。所以你可以只做var innerPtr = outerPtr;(微软应该把这种类型称为MemoryAddress这样更清楚。)
  • 我想要的是取消引用外部指针,而不仅仅是分配给另一个。
  • 如何取消引用void*?这根本没有意义。如果您知道要引用它的类型,则只能取消引用指针...并且没有具体的 void 类型。它指向的实际类型是什么?
  • 感谢 cmets。我想我在这一点上有一些误解。
  • 如果你解释了你想要结束的东西(根据具体类型,或者可能只是传递一个指向方法的指针),那么也许我们可以帮助消除任何误解。

标签: c# pointers unsafe


【解决方案1】:

(IntPtr)outerPtr.ToPointer() 实际上并没有做任何有用的事情,结果仍然包含相同的地址。

如果您想要将 void** 取消引用到 void* 的等价物,则可以使用 Marshal.ReadIntPtr(IntPtr address)

【讨论】:

  • 看来我误解了 ToPointer 的功能。我稍后会尝试您的建议。
  • IntPtr.ToPointer 只是将其转换为不安全的指针,仅此而已。
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多