2013-06-28 24 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