编程语言
首页 > 编程语言> > 结构大小无法反映C#中的正确字节数

结构大小无法反映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.

标签:sizeof,marshalling,c,pinvoke
来源: https://codeday.me/bug/20191030/1965802.html