You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义结构体Marshal报错:对象字段被非对象字段对齐/重叠

问题分析与解决方案

错误原因

你遇到的报错核心问题有两个:

  1. 使用FieldOffset显式指定字段偏移时,未给结构体添加[StructLayout(LayoutKind.Explicit)]特性——默认的Sequential布局不允许手动指定字段偏移,强行使用会触发内存对齐/重叠检查错误。
  2. 结构体中的引用类型字段(比如byte[])必须按指针大小对齐(32位进程为4字节,64位进程为8字节),你的代码中data字段偏移4在32位下符合要求,但如果是64位进程需调整为8的倍数,不过当前报错优先指向布局特性缺失的问题。

修正后的代码

[StructLayout(LayoutKind.Explicit)]
public struct Buf_t
{
    [FieldOffset(0)]
    public ushort eventType;

    [FieldOffset(4)] // 32位进程符合指针对齐,64位进程需改为8
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1932)]
    public byte[] data;

    [FieldOffset(4 + 1932)] // 用偏移+数组长度推导,避免手动计算错误
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] heap;
}

额外说明

  • 若运行在64位进程中,需将data的FieldOffset改为8,heap的偏移改为8 + 1932,确保引用类型字段按8字节对齐。
  • 手动计算偏移易出错,建议用“前字段偏移+字段长度”的方式推导后续字段偏移,避免重叠或对齐错误。

内容的提问来源于stack exchange,提问作者HockChai Lim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26