在C#中,有没有办法
- 获取存储在a中的内存地址 引用类型变量?
- 获取a的内存地址 变量?
编辑:
int i;
int* pi = &i;
- 如何打印出 pi 的十六进制值?
最佳答案
对于 #2,&
运算符将以与 C 中相同的方式工作。如果变量不在堆栈上,您可能需要使用 fixed
不过,声明在您工作时将其固定下来,这样垃圾收集器就不会移动它。
对于 #1,引用类型比较棘手:您需要使用 GCHandle
,并且引用类型必须是 blittable,即具有定义的内存布局并且可以按位复制。
为了以数字形式访问地址,您可以从指针类型转换为 IntPtr
(定义为与指针大小相同的整数类型),然后从那里转换为 uint
或 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();
}
}
关于C#内存地址和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/588817/