2014-09-11 41 views
2

用下面的代码:为什么我们不能把指针指向一个字符串?

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

它产生编译错误:

无法获取的地址,获取的大小,或宣布一个指向托管类型(“类型”)

有一个指向托管类型的指针有什么问题?

+1

[无法获取地址,获取大小或声明托管类型的指针](http://stackoverflow.com/问题/ 13299153 /不能取得这个地址的大小或声明一个指向一个托管吨) – 2014-09-11 08:44:19

+1

可能重复的[使IntPtr在C#.NET点到字符串值](http://stackoverflow.com/questions/11090427/make-intptr-in-c-net-point-to-string-value) – 2014-09-11 08:45:16

+1

编译器100%确信你不能取消引用IntPtr正确。这是正确的,该字符串可以在您初始化IntPtr后的任何时刻,几纳秒后被销毁。 .NET垃圾收集器*不是一个保守的收集器。 – 2014-09-11 09:39:08

回答

1

原因是托管对象可以作为其他对象的垃圾回收的副作用在内存中移动,从而使任何指向它们的指针无效。

int你正在服用的地址是在栈上,而不会在内存中移动 - 因此它是安全的访问指针。 (好吧,就像使用指针一样安全......)

相关问题