通过结构体某个成员的地址计算结构体首地址[转]
2014-02-14 22:13
537 查看
其实linux内核链表就通过这功能来做list_entry()的,刚在CU上看到就顺便转过来
通过结构体某个成员的地址计算结构体首地址
http://blog.chinaunix.net/u/33048/showart_1333524.html 本文欢迎自由转载,但保持本文的完整性,并注明出处。 最近在CU论坛上有很多人在问这样一个问题:给出一个结构体成员的地址计算该结构体的起始地址。其实这个题我之前也没有接触过,据说内核代码中有这样用的,但还没有看到。不过觉得这个题的解决方法还是有一定技巧的,就总结一下。下面是实现的代码。
其实整个程序中最关键的部分就是如何求出结构体中某个成员相对于结构体首地址的偏移量。这里的解决方法是:假设存在一个虚拟地址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
上述的结果中还同时考虑了结构体内的对齐问题。
通过结构体某个成员的地址计算结构体首地址
http://blog.chinaunix.net/u/33048/showart_1333524.html 本文欢迎自由转载,但保持本文的完整性,并注明出处。 最近在CU论坛上有很多人在问这样一个问题:给出一个结构体成员的地址计算该结构体的起始地址。其实这个题我之前也没有接触过,据说内核代码中有这样用的,但还没有看到。不过觉得这个题的解决方法还是有一定技巧的,就总结一下。下面是实现的代码。
/*
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\n", &s.a); unsigned long offset = STRUCT_OFFSET(stru_addr, 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。
上面程序执行的结果如下:
[root@localhost tmp]# ./a.out
start addr of s = bf81b820
c_addr = bf81b82c, offset = 12
start addr of s caculated from c addr: bf81b820
上述的结果中还同时考虑了结构体内的对齐问题。
相关文章推荐
- 通过结构体某个成员的地址计算结构体首地址[转]
- 通过结构体某个成员的地址计算结构体首地址
- C语言--通过结构体成员的地址获取结构体变量的地址
- 由结构体成员地址计算结构体地址——list_entry()原理详解
- 指针用法之一:给定结构体求某变量的偏移量,给出某变量偏移量求结构体首地址
- C#传递结构体地址(或者结构体成员的地址)给C/C++ DLL
- 怎样根据结构成员的地址找到结构体的地址(list_entry)
- 如何通过结构体成员的地址获取结构体变量的地址?
- 如何计算结构体大小和结构体中成员的内存偏移
- 如何通过一个结构体成员变量的地址找到该结构体的首地址?[备忘]
- 根据结构体某一成员的地址得到该结构体变量的首地址
- 由结构体成员地址计算结构体地址——节点地址的函数list_entry()原理详解
- 通过结构体成员的地址获取结构体变量的地址
- 计算结构体成员地址偏移量...
- 考考你:根据结构体变量地址反推结构体首地址
- 通过结构成员获得结构地址的例子
- 通过成员变量地址获取结构体地址
- 如何通过一个结构体成员变量的地址找到该结构体的首地址?
- 考考你:根据结构体变量地址反推结构体首地址
- 根据结构体变量地址反推结构体首地址