Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4729014
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: C/C++

2009-06-13 10:41:06

  最近看面试宝典,看到一个题问结构体某个成员的地址,想想list那篇不就用到了吗?有点小体会记录在这里了

/*

Author: Kenthy

Date: 6 13, 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\n", &s.a);
    
    unsigned long offset = STRUCT_OFFSET(stru_addr, c);// 这个就是成员c的相对于首地址的相对地址了

    printf("c_addr = %x, offset = %u\n", &s.c, offset);
    printf("start addr of s caculated from c addr: %x\n", (char *)&s.c - offset);//这个就是首地址了
    return 0;
}



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

上面程序执行的结果如下:
./address
start addr of s = bfad7ac0
c_addr = bfad7acc, offset = 12
start addr of s caculated from c addr: bfad7ac0


上述的结果中还同时考虑了结构体内的对齐问题。
阅读(4365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~