使用以下代码:
static unsafe void Main( string[] args )
{
int a = 5;
IntPtr pa = new IntPtr( &a ); // no error
var xa = pa.ToPointer();
string b = "test";
IntPtr pb = new IntPtr( &b ); // compile error
var xb = pb.ToPointer();
}
它生成编译错误:
无法获取地址,获取大小或声明指向托管类型的指针('类型')
指向托管类型的指针有什么问题?
答案 0 :(得分:1)
原因是托管对象可以在内存中移动,作为其他对象的垃圾收集的副作用,从而使任何指针无效。
你正在获取地址的int
在堆栈中,并且不会在内存中移动 - 因此可以安全地访问指向它的指针。 (好吧,就像使用指针一样安全......)