2013-06-28 23 views
1

好吧,這個可能很簡單,但我沒有處理C#中的非託管內存的經驗。我在我的項目包含四個字節的固定長度陣列的結構:在結構體內寫入固定長度數組

[StructLayout(LayoutKind.Sequential)] 
unsafe struct MessageHeader { 
    ... 
    public fixed byte Prefix[4]; 
    ... 
} 

現在我想要做的是創造型的MessageHeader的對象,並分配一些字節的前綴。我試過如下:

MessageHeader x; 
unsafe { 
    fixed (byte* ptr = x.Prefix) { 
     Marshal.Copy(new byte[] { 128 , 64, 128, 64 }, 0, new IntPtr(ptr), 4); 
    } 
    ... 
} 

不過,我有以下錯誤: 「你不能用一個固定的語句來採取固定已表達的地址」。

我試圖使用它沒有固定的:

Marshal.Copy(new byte[] { 128, 64, 128, 64 }, 0, new IntPtr(x.Prefix), 4); 

但是,這給了我一個可能未初始化結構的錯誤。在寫入任意非託管緩衝區時,這不應該是無關緊要的嗎?

回答

1

試試這個。 x.Prefix已經是指針了,它已經被修復了。

MessageHeader x; 

// other ways to initialize x: 
// var x = default(MessageHeader); 
// var x = new MessageHeader(); 

unsafe 
{ 
    Marshal.Copy(new byte[] { 128, 64, 128, 64 }, 0, new IntPtr(x.Prefix), 4); 
} 
+0

不要看你的代碼行,我的第二個代碼行之間的區別......正如我已經說過,我得到一個錯誤對未初始化結構 – mbue

+0

我沒有看到任何錯誤。誰在說這個? – hazzik

+1

你實際上把你的x初始化寫成'var x = new MessageHeader();' – hazzik