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

使用Marshal.PtrToStructure处理非标准对齐结构体的问题

问题解答

默认情况下,Marshal.PtrToStructure无法正确处理这种按8字节对齐的结构体——因为.NET平台默认的结构体封送对齐规则,和你提到的8字节对齐逻辑不匹配。

要正确封送这类结构体,你需要在C#的对应结构体定义中,通过StructLayout特性显式指定对齐规则,和原生C结构体的对齐方式保持一致:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
struct SomeStruct
{
    public int field1;
    public int field2;
}

关键说明:

  • LayoutKind.Sequential确保结构体字段按定义顺序在内存中排列,和C结构体的字段顺序完全一致;
  • Pack = 8指定结构体的对齐打包值为8字节,完美匹配原生结构体的8字节对齐规则;
  • C#中的int类型对应C的int32_t,字段类型的精准匹配是内存解析正确的基础。

定义好上述结构体后,再调用Marshal.PtrToStructure就能正确将内存指针转换为C#结构体实例。

内容的提问来源于stack exchange,提问作者Shanoa Ice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:14