c - 如何获得结构体中正确的偏移地址

标签 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 字节的虚拟数组。

最佳答案

由于您所呈现的结构似乎是要覆盖在某些现有内存或设备映射上,因此我们无法真正更改它。但是,如果您的观点是在复制此数据时想要节省内存,那么您当然可以“克隆”该结构,而无需不必要的虚拟(以及任何其他不必要的成员),然后复制它:

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.
}

关于c - 如何获得结构体中正确的偏移地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34264125/

相关文章:

c++ - sscanf 写入变量问题

c - C中的二进制文件读/写

c - 从结构体的动态数组中删除元素

c - 多进程使用curl,什么时候必须调用curl_global_init?

c - 如何从文件功能中进行工作读取?

linux - 是什么导致内存不断上升perl?

c++ - C++ 中的自动变量

memory - 确定虚拟内存的页表大小

c - 如何获取正在运行的 Linux 内核中存在的结构的实例数?

无法使用 floorf 将数字四舍五入到小数点后两位