C# 内存地址和变量

2023-12-07

在C#中,有没有办法

  1. 获取存储在a中的内存地址 引用类型变量?
  2. 获取a的内存地址 多变的?

EDIT:

int i;
int* pi = &i;
  • 如何打印 pi 的十六进制值?

对于#2,&运算符的工作方式与 C 中相同。如果变量不在堆栈上,您可能需要使用fixed不过,在您工作时将其固定下来,这样垃圾收集器就不会移动它。

对于#1,引用类型比较棘手:您需要使用GCHandle,并且引用类型必须是 blittable,即具有定义的内存布局并且可以按位复制。

为了以数字形式访问地址,您可以从指针类型转换为IntPtr(定义为与指针大小相同的整数类型),然后从那里到uint or ulong(取决于底层机器的指针大小)。

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class Blittable
{
    int x;
}

class Program
{
    public static unsafe void Main()
    {
        int i;
        object o = new Blittable();
        int* ptr = &i;
        IntPtr addr = (IntPtr)ptr;

        Console.WriteLine(addr.ToString("x"));

        GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
        addr = h.AddrOfPinnedObject();
        Console.WriteLine(addr.ToString("x"));

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

C# 内存地址和变量 的相关文章

随机推荐