簡體   English   中英

無法聲明指向非非托管類型int * C#的指針

[英]Cannot declare pointer to non unmanaged type int* C#

  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* 
      {
      }
   }

我對第二個固定塊的操作與我對第一個固定塊的操作幾乎相同。 我將變量i的地址分配給指針q。 允許直接地址分配,而在另一個指針中獲取地址並在分配中使用該指針失敗。 但是,在固定上下文之外,同樣的步驟也起作用。

您正在使用什么版本的C#? 第一個fixed語句也不適合我編譯( You cannot use the fixed statement to take the address of an already fixed expression )。

修復非托管指針沒有任何意義。 它已經修復,GC永遠無法觸及。

例如,當您使i成為類的成員字段時,這種情況就會更改。 突然,它不再受方法限制, 可以由GC(及其計數對象)移動。 在這種情況下,您必須使用fixed語句。

編譯器不允許您使用指向未修復的托管變量的指針,也不允許您修復未托管或修復的變量。

以同樣的方式,如果您將指針指向數組的開頭,例如 make int[] i並取&i[0] ,這又需要修復,因為不再保證它是本地范圍的。 如果確實需要本地范圍內的非托管數組,則可以使用stackalloc關鍵字,但是再次,這基本上意味着您要從托管.NET的相對安全中stackalloc

fixed語句用來釘住管理變量,因此垃圾回收不會動它。

在正常操作中,垃圾收集器可以自由移動對象。 這對於指針將是一個問題,因為如果垃圾回收器將您有指針的對象移動到該指針,則該指針將不再有效。 fixed為您提供了解決方案,方法是讓您固定變量,告訴垃圾回收器該對象的指針可能存在,並且在代碼塊的持續時間內不得移動它們。

C#編譯器僅允許您在固定語句中將指針分配給托管變量。

分配在堆棧上的變量(值類型)不受垃圾收集器的約束,並且不會在內存中移動,因此,對於此類變量而言, fixed既不必要又不正確。 這就是為什么您的第二個(實際上也是第一個) fixed語句產生錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM