zoukankan      html  css  js  c++  java
  • 通过结构体某个成员的地址计算结构体首地址

    给出一个结构体成员的地址计算该结构体的起始地址,据说内核代码中有这样用的,但还没有看到。不过觉得这个题的解决方法还是有一定技巧的,就总结一下。下面是实现的代码。 

    /*
    Author: Godbach
    Date: Oct 23, 2008
    */
    #include <stdio.h>
    #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element
    struct stru_addr 
    {
        int a;
        char b;
        int d;
        char c;
    
    };
    
    int main(void)
    {
        struct stru_addr s;
        printf("start addr of s = %x
    ", &s.a);
        
        unsigned long offset = STRUCT_OFFSET(stru_addr, c);
    
        printf("c_addr = %x, offset = %u
    ", &s.c, offset);
        printf("start addr of s caculated from c addr: %x
    ", (char *)&s.c - offset);
        return 0;
    }

    其实整个程序中最关键的部分就是如何求出结构体中某个成员相对于结构体首地址的偏移量。这里的解决方法是:假设存在一个虚拟地址0,将该地址强制转换成为该结构体指针类型(struct stru_name*)0。那么地址0开始到sizeof(struct)-1长度的内存区域就可以视为一个结构体的内存。这样结构体中任何一个元素都可以通过对该结构体指针解引用得到。由于该结构体的起始地址为0, 因此任何一个成员的地址应该等于其相对于结构体起始地址的偏移,这也就是计算偏移量的方法:(unsigned long)&((struct stru_name*)0)->element。

    上面程序执行的结果如下:
    [root@localhost tmp]# ./a.out
    start addr of s = bf81b820
    c_addr = bf81b82c, offset = 12
    start addr of s caculated from c addr: bf81b820

    上述的结果中还同时考虑了结构体内的对齐问题。

  • 相关阅读:
    Log4Net 配置详解
    .Net Core 获取应用物理路径的常见问题
    Js/Jquery获取iframe中的元素
    Ztree树使用详解
    【解决】nginx + socket.io ,能连接但不响应事件
    基础文档官方链接
    位运算
    Java基础之集合框架--Collections.reverse()方法
    Android动画攻略—帧动画、补间动画、属性动画
    [转]京东mPaaS移动日志建设与应用
  • 原文地址:https://www.cnblogs.com/chen-farsight/p/6031935.html
Copyright © 2011-2022 走看看