免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HopeCao
打印 上一主题 下一主题

挑战高手,看一行看不懂的代码. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-02-24 13:51 |只看该作者

挑战高手,看一行看不懂的代码.

相对地址偏移量的概念能不能详细的解释一下,结合上面说的,多谢了。

论坛徽章:
0
12 [报告]
发表于 2003-02-24 14:45 |只看该作者

挑战高手,看一行看不懂的代码.

根据成员的地址偏移量以及地址可以计算出宿主结构的地址:
成员地址 - offset = 宿主地址

论坛徽章:
0
13 [报告]
发表于 2003-02-24 15:25 |只看该作者

挑战高手,看一行看不懂的代码.

那宏定义的是   成员的地址  还是   地址的偏移量,另size_t是什么意思,
0具体指什么?能不能再明确的答一下?

论坛徽章:
0
14 [报告]
发表于 2003-02-24 16:12 |只看该作者

挑战高手,看一行看不懂的代码.

其实,这个问题很简单,给大家看一个例子:

#define offsetof(s, m) (size_t)(&(((s *)0)->;m))

这是offsetof的标准实现,主要是计算出结构体里成员的相对地址偏移量。

这里使用0只是一个使用的技巧,方便计算出偏移量。

楼主的那个宏和这个大同小异。


老大!能跟我们讲解一下吗!
谢谢了!

论坛徽章:
0
15 [报告]
发表于 2003-02-24 18:48 |只看该作者

挑战高手,看一行看不懂的代码.

各位,不好意识,我在解释一下,
#define offsetof(s, m)  (size_t)(&(((s *)0)->;m))
这个宏用来求一个结构体成员相对于这个结构体首地址的偏移量,
例如:
struct zhx{
int lanjuan;
};
这个结构体里的成员lanjuan,它的相对偏移量就是4;
这个宏里的0是地址,(s *)0,这一步是把从0这个地址开始的一块大小的内存解释成这个结构体类型,&(((s *)0)->;m),这一步是取这个结构体程序m的地址,结合zhx这个结构体的例子,如果取成员lanjuan的地址,这个地址当然是4,对吧!也就是说,通过这个技巧,我们可以很方便的得到了这个成员偏移量。

size_t其实就是无符号整形,也就是把上面得到的那个地址转成无符号整形,楼主的那个宏和这个是一个道理,但显然没这个宏定义的更加严密!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2003-02-24 19:43 |只看该作者

挑战高手,看一行看不懂的代码.

设有结构变量

struct tagX
{
......
<typeY>; y;
......
}x;

其中 typeY 是任意一个合法的类型名。

假设 ptrx 是指向 x 的指针。

那么,分量 y 的偏移量是指:“类型 tagX 的任意一个实例的地址与其分量 y 的地址的差”。

对于实例 x 来说,就是 &amp;(ptrx->;y) - ptrx。
------------------------- ^ ------ ^
----------------------   实例的地址  分量的地址

如果我们用 offset 来表示这个差值,就有

      offset = &amp;(ptrx->;y) - ptrx

这一点是显而易见的。
特别的,当 ptrx 等于 0 时(虽然事实上 ptrx 永远也不会等于 0 ),
我们有:

      offset = &amp;( 0->;y )

由于常量 0 的类型必须明确指定,所以就写作

      offset = &amp;( ((struct tagX *)0) ->; y )

说到这儿就比较明显了,如果我们定义宏

# define offset     (&amp;( ((struct tagX *)0) ->; y ) )

那么该宏的值就是 struct tagX 结构中的分量 y 相对于实例首址的偏移量。
其中 tagX 和 y 只是一个例子,一个更广泛使用的做法是用含有参数的宏将
tagX 和 y 代换:

# define offset( tagX, y )    ( &amp;( ((tagX *)0) ->; y )

至于 size_t,它表示一个尺寸的类型,在大多数的系统中,它是基本类型
unsigned int 的一个宏。

论坛徽章:
0
17 [报告]
发表于 2003-02-25 10:25 |只看该作者

挑战高手,看一行看不懂的代码.

完全明白了,多谢诸位高手的回答。

论坛徽章:
0
18 [报告]
发表于 2003-02-25 10:33 |只看该作者

挑战高手,看一行看不懂的代码.

原帖由 "flw" 发表:
骸袄嘈?tagX 的任意一个实例的地址与其分量 y 的地址的差”。

对于实例 x 来说,就是 &amp;(ptrx->;y) - ptrx。
------------------------- ^ ------ ^
----------------------   实例的地址  分量的地址

..........

很好,有高手风范,特别是"实例"一词的使用,很严谨.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2003-02-25 16:12 |只看该作者

挑战高手,看一行看不懂的代码.

兄台过奖了!

论坛徽章:
0
20 [报告]
发表于 2003-02-26 17:45 |只看该作者

挑战高手,看一行看不懂的代码.

看来这里还是有C语言的高手
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP