フィールドを含む順序付けられた構造体があります..
[StructLayout(LayoutKind.Explicit)]
public unsafe struct RunBlock_t {
[System.Runtime.InteropServices.FieldOffset(0)] public fixed byte raw[512];
}
これを関数内で宣言し、ポインターを使用したい場合は、正常に動作します..
{
RunBlock_t r = new RunBlock_t();
for (int i=0; i<512; i++) r.raw[i]=0;
}
しかし、変数をスコープ外で宣言すると、固定の実装が必要になります
RunBlock_t r;
{
r = new RunBlock_t();
fixed (byte* ptr = r.raw) for (int i=0; i<510; i++) ptr[i]=0;
}
この動作の違いはなぜですか?
---編集済み-----
他の順列は機能しないことをもう一度述べたいだけです。
unsafe void foo() {
RunBlock_t r = new RunBlock_t();
fixed (byte* ptr = r.raw) for (int i = 0; i < 512; i++) ptr[i] = 0;
}
生成する fixed ステートメントを使用して、既に固定されている式のアドレスを取得することはできず、コンパイルされません。
RunBlock_t r;
unsafe void foo() {
r = new RunBlock_t();
for (int i=0; i<512; i++) r.raw[i]=0;
}
生成固定されていない式に含まれる固定サイズのバッファーは使用できません。固定ステートメントを使用してみてください。コンパイルされません。