指针类型静态字段的值被调试器显示为零 0x0,而实际上它具有有效值

2024-01-12

我在尝试使用类型访问结构体静态字段的值时遇到了这种行为uint*

调试时,监视窗口显示静态字段StaticBitMask的值为零,但实际上(并且如预期的那样)它是一个有效的指针,并且Console.WriteLine()打印它,如下面的控制台输出所示:

Pointers:
-----------------
Static bitmask pointer: 0x706790
Instance bitmask pointer: 0x708A20

Values:
-----------------
Static bitmask pointer val: 0xFFFFFFFF
Instance bitmask pointer val: 0xFFFFFFFF

使用固定实例字段不会观察到这种不一致的行为。对于这些,可以在监视窗口中看到实际值并打印出来。

为什么会发生这种情况?顺便说一句,我知道这不是一个令人惊叹的节目,但为什么,有人想知道。

另外,结构体中具有指针类型的静态字段会产生什么后果?因为它不能被标记为fixed,是否有可能随时移动购买GC?

这是源代码,您可以直接作为控制台应用程序运行来重现问题。

Thanks.

using System;
using System.Runtime.InteropServices;

public unsafe struct UIntBitMask
{
    private static int uintNumberOfBits = sizeof(uint) * 0x8;

    public static uint* StaticBitMask;

    public fixed uint InstanceBitMask[1024]; // uintNumberOfBits * uintNumberOfBits = 32 * 32 = 1024

    public UIntBitMask(bool fillBitMask)
    {
        GetUnmanagedBitMask();
    }

    static UIntBitMask()
    {
        IntPtr pointer = Marshal.AllocHGlobal(uintNumberOfBits * uintNumberOfBits * sizeof(uint));
        StaticBitMask = (uint*)pointer.ToPointer();
        for (int i = 0; i < uintNumberOfBits; i++)
            for (int j = 0; j < uintNumberOfBits; j++)
                ((uint*)&StaticBitMask[i])[j] = ((uint.MaxValue >> (uintNumberOfBits - j)) << i);
    }

    private void GetUnmanagedBitMask()
    {
        fixed (uint* structPointer = InstanceBitMask)
        {
            for (int i = 0; i < uintNumberOfBits; i++)
                for (int j = 0; j < uintNumberOfBits; j++)
                    ((uint*)&structPointer[i])[j] = ((uint.MaxValue >> (uintNumberOfBits - j)) << i);
        }
    }
}

public class PointerTypeStaticFieldLab
{
    static unsafe void Main()
    {
        UIntBitMask instance = new UIntBitMask(true);
        Console.WriteLine("Pointers:");
        Console.WriteLine("-----------------");
        Console.WriteLine("Static bitmask pointer: 0x{0:X}", new IntPtr(UIntBitMask.StaticBitMask).ToInt64());
        Console.WriteLine("Instance bitmask pointer: 0x{0:X}", new IntPtr(instance.InstanceBitMask).ToInt64());
        Console.WriteLine();
        Console.WriteLine("Values:");
        Console.WriteLine("-----------------");
        Console.WriteLine("Static bitmask pointer val: 0x{0:X}", UIntBitMask.StaticBitMask[0]);
        Console.WriteLine("Instance bitmask pointer val: 0x{0:X}", instance.InstanceBitMask[0]);
    }
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针类型静态字段的值被调试器显示为零 0x0,而实际上它具有有效值 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli

随机推荐