2014-03-04 135 views
0
unsafe static void Main(string[] args) 
    { 
     int i=6; 
     int* j = &i; //Allowed 
     int* k = j; //Allowed 
     fixed(int* q = &i) //Allowed 
     { 
     } 
     fixed(int* q = j) //Cannot declare pointer to non unmanaged type int* 
     { 
     } 
    } 

我對第2個固定塊的操作與我在第一個固定塊中所做的操作基本相同。 我將一個變量i的地址賦值給一個指針q。直接地址分配是允許的,同時在另一個指針中使用地址並在分配中使用該指針失敗。然而,在固定環境之外,相同的步驟仍然有效。發生了什麼事?無法將指針指向非非託管類型int * C#

+2

你確定這是錯誤文本嗎?請剪切並粘貼確切的文字。 –

+0

第一個固定塊對我來說是無效的......「你不能使用固定語句來獲取已經固定的表達式的地址」。請發佈您的確切代碼。 –

回答

0

您使用的是什麼版本的C#?第一個fixed聲明也不會爲我編譯(You cannot use the fixed statement to take the address of an already fixed expression)。

修復非託管指針沒有意義。它已經修復了,它不能被GC觸及。

例如,當您使i成爲類的成員字段時,此更改。突然之間,它不再是該方法的範圍,並且可以通過GC(以及它的計數對象)移動。在這種情況下,您使用fixed語句。

編譯器不允許您將指針指向未固定的託管變量,並且它不會允許您修復非託管或固定變量。

同樣的方法,如果你把一個指針指向一個數組的開始,例如。使int[] i,並採取&i[0],它再次需要修復,因爲它不再保證本地作用域。如果您確實需要一個本地範圍的非託管陣列,則可以使用stackalloc關鍵字,但這又意味着您正在削減受管.NET的相對安全性。

0

The fixed statement用於一個託管變量,以便垃圾回收器不會移動它。

在正常操作中,垃圾收集器可自由移動物體。這對於指針來說是一個問題,因爲如果垃圾收集器移動了一個指向的對象,指針將不再有效。 fixed通過讓你引腳爲變量提供了一個解決方案,告訴垃圾收集器指向該對象的指針可能存在,並且它不能在代碼塊的持續時間內移動它們。

C#編譯器只允許您在固定語句中指定託管變量的指針。

堆棧(值類型)上分配的變量不受垃圾收集器,並且將不在存儲器中移動,所以fixed既不必要的和不正確這樣的變量。這就是爲什麼你的第二個(也是你的第一個)fixed聲明產生一個錯誤。

相關問題