【问题标题】:Can't assign Static Double Pointer variable无法分配静态双指针变量
【发布时间】:2019-09-08 22:05:35
【问题描述】:

我似乎无法分配静态双指针变量。我是不是做错了什么?

使用 .Net 4.7.2

static unsafe float** pointers = (float**)Marshal.AllocHGlobal(sizeof(float) * 32);

static unsafe void Main(string[] args)
{
       var i = pointers == default; // false but displays 0x0000000000000000

       // stil the same
       pointers = (float**)Marshal.AllocHGlobal(sizeof(float) * 32);

       // works - 0x00000213094bc7c0
       float** test = (float**)Marshal.AllocHGlobal(sizeof(float) * 32);
}

调试 - 64 倍

这是正确的行为还是发生在其他人身上?

【问题讨论】:

  • 不是我的菜,但不应该是static unsafe float** pointers吗?甚至不需要编译吗?而且我对您如何在没有 unsafe 代码块或 Main 方法声明中的 unsafe 的情况下成功逃脱感兴趣?
  • @stuartd 已编辑:unsafe 在基类 Program 中。
  • 啊,很公平。虽然无法在 4.5 或 4.7.2 或 4.8 中使用此代码进行重现 - 此代码是否会为您重现该问题?
  • 是的,图片已添加。
  • 您的指针是 32 位还是 64 位?浮点数是 32 位,所以看起来你被分配了 32 个指向浮点数的指针。指针的大小将根据编译器选项而有所不同。只有 64 位编译器选项将是 64 位。看起来您被分配了 64 位的 0x0000000000000000。我认为错误是指针只有 32 位。

标签: c# .net visual-studio pointers double-pointer


【解决方案1】:

看起来纯粹是调试器问题:在这两种情况下都分配了内存,您可以将 pointers 强制转换为 IntPtr 并且它不是 0。

问题可以通过您提供的代码重现:

在设置中关闭Use Managed Compatibility Mode 时,我能够看到pointers 的地址:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多