成员结构,通过结构体某个成员的地址计算结构

时间:2019-09-25 21:15来源: 操作系统
多年来在CU论坛上有很几个人在问那样三个难点:给出贰个结构体成员的地点总计该结构体的序曲地址。其实那么些题小编以前也未尝接触过,据悉内核代码中有这么用的,但还不曾观

多年来在CU论坛上有很几个人在问那样三个难点:给出贰个结构体成员的地点总计该结构体的序曲地址。其实那么些题小编以前也未尝接触过,据悉内核代码中有这么用的,但还不曾观望。可是以为那么些题的消除格局如故有一定本领的,就总括一下。下边是促成的代码。

经过结构体某些成员的地点总括结构体首地址 (转),成员结构

近年来在CU论坛上有很三人在问那样四个标题:给出叁个结构体成员的地方总计该结构体的前奏地址。其实这些题作者事先也尚未接触过,据他们说内核代码中有像这种类型用的,但还尚未看到。不过认为那一个题的消除办法依旧有必然技术的,就计算一下。下边是兑现的代码。

 1 /*
 2 Author: Godbach
 3 Date: Oct 23, 2008
 4 */
 5 #include <stdio.h>
 6 #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element
 7 struct stru_addr 
 8 {
 9     int a;
10     char b;
11     int d;
12     char c;
13 
14 };
15 
16 int main(void)
17 {
18     struct stru_addr s;
19     printf("start addr of s = %xn", &s.a);
20     
21     unsigned long offset = STRUCT_OFFSET(stru_addr, c);
22 
23     printf("c_addr = %x, offset = %un", &s.c, offset);
24     printf("start addr of s caculated from c addr: %xn", (char *)&s.c - offset);
25     return 0;
26 }

实际上整个程序中最重视的片段正是什么样求出结构体中有些成员相对于组织体首地址的偏移量。这里的消除措施是:若是存在二个设想地址0,将该地址强制转变来为该协会体指针类型(struct stru_name*)0。那么地址0初始到sizeof(struct)-1长度的内部存款和储蓄器区域就足以说是叁个结构体的内存。那样结构体中别的三个成分都足以经过对该组织体指针解援用获得。由于该结构体的苗子地址为0, 因而任何一个分子的地址应该对等其相对于结构体起首地址的撼动,那相当于计量偏移量的主意:(unsigned long)&((struct stru_name*)0)->element。

地点程序执行的结果如下:

1 [[email protected] tmp]# ./a.out 
2 start addr of s = bf81b820
3 c_addr = bf81b82c, offset = 12
4 start addr of s caculated from c addr: bf81b820

上述的结果中还同一时候思量了结构体内的对齐难点。

原稿地址:

(转),成员结构 前段时间在CU论坛上有很三人在问那样多个难题:给出三个结构体成员的地方计算...

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element 4 struct stru_addr  5 { 6     int a; 7     char b; 8     int d; 9     char c;10 11 };12 13 int main()14 {15     struct stru_addr s;16     unsigned long offset = 0;17     printf("start addr of s = %xn", &s.a);18     19     offset = STRUCT_OFFSET(stru_addr, c);20 21     printf("c_addr = %x, offset = %un", &s.c, offset);22     printf("start addr of s caculated from c addr: %xn", (char *)&s.c - offset);23     system("pause");24     return 0;25 }

事实上整个程序中最重要的部分正是哪些求出结构体中某些成员绝对于协会体首地址的偏移量。这里的消除措施是:假使存在一个虚构地址0,将该地址强制调换来为该组织体指针类型(struct stru_name*)0。那么地址0起头到sizeof-1长度的内部存款和储蓄器区域就足以视为叁个结构体的内部存款和储蓄器。那样结构体中别的三个成分都足以经过对该组织体指针解引用得到。由于该结构体的原初地址为0, 由此任何一个成员的地点应该相等其绝对于结构体开头地址的舞狮,那也正是持筹握算偏移量的不二等秘书技:(unsigned long)&((structstru_name*)0)->element。

地点程序推行的结果如下:

1 [root@localhost tmp]# ./a.out 2 start addr of s = bf81b8203 c_addr = bf81b82c, offset = 124 start addr of s caculated from c addr: bf81b820

上述的结果中还同不常间想念了组织体内的对齐难点。

原稿地址:

编辑: 操作系统 本文来源:成员结构,通过结构体某个成员的地址计算结构

关键词: