如何在结构中获得正确的偏移地址

时间:2015-12-14 10:00:29

标签: c memory struct structure

我在单一结构下定义所有寄存器并将其大小作为偏移量访问,如下所示。

typedef struct _REG_STRUC {
UINT32      E1000_CTRL     // 0x00000       
UINT32      E1000_CTRL_DUP  //0x00004  
UINT32 E1000_STATUS //0x00008  
UINT32 E1000_EERD   //0x00014  
UINT32 E1000_CTRL_EXT   //0x00018   
UINT32 E1000_FLA    //0x0001C  
UINT32 dummy[3] //0x00020-0x00028   
UINT32 E1000_FCAH    //0x0002C  
}*REGP;

正如你可以看到的,我已经插入了一个虚拟数组来跳过12个字节。如果我跳过这12个字节,我只能获得E1000_FCAH寄存器的确切存储位置。据我所知,这是浪费记忆。如何克服这一点。知道我这个

编辑:阅读this thread后,我了解了填充概念。我想通过使用它作为偏移地址来访问reg E100_FCAH。因此,为了避免错误的获取(由于12字节的间隙),我使用了大小为12字节的虚拟数组。

1 个答案:

答案 0 :(得分:1)

由于您所呈现的结构似乎要覆盖在某些现有内存或设备映射上,因此我们无法真正更改它。但是,如果您希望在复制此数据时节省内存,则可以在没有不必要的dummy(以及任何其他不必要的成员)的情况下“克隆”结构,并复制它:

typedef struct _PACKED_STRUC {
UINT32      E1000_CTRL     // 0x00000       
UINT32      E1000_CTRL_DUP  //0x00004  
UINT32 E1000_STATUS //0x00008  
UINT32 E1000_EERD   //0x00014  
UINT32 E1000_CTRL_EXT   //0x00018   
UINT32 E1000_FLA    //0x0001C
UINT32 E1000_FCAH    //0x0002C  
}*PACKEDP;

void copy_from_raw(REGP rawp, PACKEDP outp) {
    outp->E1000_CTRL = rawp->E1000_CTRL;
    // etc.
}