结构大小无法反映C#中的正确字节数

我的结构定义如下:

public struct champ
{
    public uint mem1;
    public byte[] mem2;

    public champ(int x)
    {
        mem1 = x;
        mem2 = new byte[15];
    }
}

创建对象后

champ sample = new champ (2);

应用Marshal.SizeOf(sample)返回4 4 = 8而不是415.为什么?

如果它是一个类,我可以理解该逻辑,因为第二个成员是一个占用4个字节的指针,该指针指向堆上的字节数组mem2.为什么会在结构上发生这种情况?

解决方法:

mem2字段没有MarshalAs属性,因此使用默认编组.这就是指向第一个元素的指针.

您可能打算写:

public struct champ
{
    public uint mem1;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
    public byte[] mem2;

    public champ(int x)  { ... }
}

结构的大小为20,因为对齐规则意味着在结构的末尾添加了一个额外的填充字节.需要确保该结构的大小是uint大小的4的精确倍数.这样可以确保该结构的数组可以正确对齐mem1.

上一篇:来自不受管理的世界的C#结构是否可以“实时”更新?


下一篇:C#联合结构编组