C#内存地址和变量

标签 c# .net memory-management

在C#中,有没有办法

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

编辑:

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

最佳答案

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

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

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

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();
    }
}

关于C#内存地址和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/588817/

相关文章:

c# - 使用 SendMessage 击败 'A program is trying to access email'

C# 正则表达式验证 "realistic"IP 值

c - 嵌入式系统上分层通信堆栈的内存管理

ios - 不要在初始化方法和 dealloc 中使用访问器方法

c# - 我的 MEF 导出有问题吗?

c# - C# 中的参数多态?

.net - 是否可以通过在 ASP.NET 中模拟 Windows 身份验证用户从 Active Directory 中检索数据?

c# - 附加和更新有什么区别?

.net - 从 Sybase 获取数据时,阿拉伯字符在 .Net 中显示为垃圾

objective-c - 设置为 nil 后对象仍然存在