首页新闻招聘找找看知识库

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

0
悬赏园豆:5 [已解决问题]

 [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 | 大侠五级 |园豆:6659 | 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 | 园豆:6659 (大侠五级) | 2017-05-24 10:31
   您需要登录以后才能回答,未注册用户请先注册