首页 新闻 会员 周边 捐助

C#结构体内存布局问题。

0
悬赏园豆:5 [已解决问题] 解决于 2017-05-24 11:20

 [StructLayout(LayoutKind.Explicit, Pack = 2)]
    public struct RCV_REPORT_STRUCTExV3
    {
        [FieldOffset(0)]
        public System.UInt16 m_cbSize; 
        [FieldOffset(2)]
        public System.UInt32 m_time;    
        [FieldOffset(6)]
        public System.UInt16 m_wMarket; 
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        [FieldOffset(8)]
        public char[] m_szLabelName;   
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        [FieldOffset(18)]             //此处的偏移量位置应该设置为18的,但是报错:在18偏移位置包含一个对象字段,把偏移量设置为
                                                 //20程序正常,怎么回事。因为某些原因这个结构的内存大小需要固定,设置为20就会影响到其他字
                                                 //段,或者结构太大。先谢谢了!
        public char[] m_szName; 

_恰似的主页 _恰似 | 初学一级 | 园豆:181
提问于:2017-05-23 18:02
< >
分享
最佳答案
1

大声告诉我数组这个算引用类型还是值类型?

引用类型需要额外4个字节用于引用(64位机器8字节)

收获园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2017-05-23 19:03

但是布局设置为顺序:[StructLayout(LayoutKind.Sequential, Pack = 1)]

结构的内存计算是正常的。上面代码中字段内存相加sizeof=50,结构sizeof=50,是怎么回事?

_恰似 | 园豆:181 (初学一级) | 2017-05-24 09:29

@唯恐: LayoutKind.Sequential只保证有序但不保证是连续的。Explicit才保证在内存中的偏移位置和你指定的offset一致。

Daniel Cai | 园豆:10424 (专家六级) | 2017-05-24 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册