2015-09-03 11 views
8

以下の例のfixed (int* pArray = &array[0])行は、配列全体を固定しますか、それとも単にarray[0]ですか?固定キーワードを使用してC#で配列全体を固定する方法

int array = new int[10]; 
unsafe { 
    fixed (int* pArray = &array[0]) { } // or just 'array' 
} 
+0

だと思います。 'fixed(int * pArray = array)' –

+0

@Mを実行する必要があります。CS0208管理された型( 'int []')のアドレスを取得、サイズを取得、または宣言できません。 –

+2

@ThomasLevesqueは '&' before '配列を配置しません'。 '(int * pArray = array)'と書いてください。 –

答えて

6

次の文:

fixed (int* pArray = array) 

完全配列を修正します。証明C# language specification(18.6節固定声明、強調鉱山)で見つけることができます:

固定ポインタ初期化子は次のいずれかになります。

...

  • 非管理型Tの要素を持つ配列型の式です。ただし、型T *は、固定ステートメントで指定されたポインタ型に暗黙的に変換可能である必要があります。この場合、イニシャライザは配列の最初の要素のアドレスを計算し、は配列全体が固定ステートメントの期間中固定アドレスにとどまることが保証されます。 ...

次の文:

fixed (int* pArray = &array[0]) 

修正最初の配列要素のアドレス。ここでも、仕様(その章で見つかった例から)からの引用:

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
... 

...と第三の文修正配列要素のアドレスを取得します。


サイドノート:私は最初要素を修正したまともな実装では、単に全体の配列を修正することを前提としますが、仕様がそれを保証していないようです。仕様の例コードに少し深く掘り

は、以下を明らかにする:

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
[fourth fixed statement:] fixed (int* p = a) F(p); 
... 

例の第四の固定された文は、上記第三のと同様の結果を生成します。

残念ながら、彼らはまさに彼らは「同様の結果」によって何を意味するのかを指定していないが、彼らが「同じ結果」を言わなかったことは注目に値します。

関連する問題