前一阵子百度来校园招聘时的一道笔试题

xlbdan 2007-09-25 11:52:35
#define offset(TYPE,MEMBER) (size_t & ((TYPE*)0))->MEMBER
问这个宏是什么意思?

...全文
1116 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
InsideKernel 2008-04-09
  • 打赏
  • 举报
回复
在stddef.h中有类似定义,如下:

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

(s *)0 的意思就是指从这个结构体变量是从0地址开始的;
&(((s *)0)->m)取该结构体变量(首地址是0)m成员的地址;

返回的结果是m在结构体中的偏移(以字节为单位)。

zzyjsjcom 2008-04-01
  • 打赏
  • 举报
回复
这个宏在使用的过程中 要用字节指针:

下面有个测试代码 , 你可以跑跑看:

#define offset(TYPE,MEMBER) ((size_t)(&((TYPE *)0)->MEMBER))

typedef struct t_tag
{
int a;
int b;
int c;
}t;

int main()
{
t test;
unsigned char *pt = (unsigned char *)&test;
int move = offset(t, c);

test.a = 3;
test.b = 4;
test.c = 5;

printf("%d ", *((int *)pt));
pt = pt + move;

printf("%d", *((int *)pt));
return 0;
}

运行结果 :3 5
qld001 2007-09-26
  • 打赏
  • 举报
回复
flyerwing()
很深了,学校是搞不到那个级别吧!
hjzwl1018()
狠了去了```这些东西哪能学到?这些属于哪块编程?
=========================================================================
自学!大学期间不能指望学校教你所有东西,要学会自己找食吃!
xlbdan 2007-09-26
  • 打赏
  • 举报
回复
sxlengwa的解释挺好的,不过我当时没抄下来,现在印象中就是我写的那样的,当时也没弄出来...
flyerwing 2007-09-26
  • 打赏
  • 举报
回复
很深了,学校是搞不到那个级别吧!
hjzwl1018 2007-09-26
  • 打赏
  • 举报
回复
狠了去了```这些东西哪能学到?这些属于哪块编程?
NKLoveRene 2007-09-25
  • 打赏
  • 举报
回复
看来baidu到哪都用一套题啊
所以笔试前先在网上搜搜看有没有今年的笔试题出来,呵呵
Treazy 2007-09-25
  • 打赏
  • 举报
回复
我关心的是表达式中的0
求偏移那显而易见

关键这个0难道不能让大家想到些什么吗?
我能想到的就是
我上面提到的选择入口函数!
  • 打赏
  • 举报
回复
C库 宏 offsetof
lbaby 2007-09-25
  • 打赏
  • 举报
回复
member 在type中偏移量= member 的地址 - type地址
如果直接设type地址为0的话,那么member的地址就是偏移量了
Treazy 2007-09-25
  • 打赏
  • 举报
回复
oo(为了名副其实,努力学习oo技术ing) ( ) 信誉:110 2007-09-25 12:03:15 得分: 0


求member在struct中的偏移
-----------------------------------
求偏移是这个宏嘛?难道看offset就清楚了?
还请给予解释!

Treazy 2007-09-25
  • 打赏
  • 举报
回复
#define offset(TYPE,MEMBER) (size_t & ((TYPE*)0))->MEMBER
-------------------------------------
看表达式MEMBER应该是TYPE的成员
将0强制转换为指向为类型为TYPE的指针
并将类型size_t与上此指针,并将结果指向其成员MEMBER

猜想,在0入口开始应该是很多函数入口的指针,用这个宏可以强制从指定入口开始
执行程序。当然这里只是选择哪个成员。

oo 2007-09-25
  • 打赏
  • 举报
回复
求member在struct中的偏移
sxlengwa 2007-09-25
  • 打赏
  • 举报
回复
#define offset(TYPE,MEMBER) (size_t)(&((TYPE*)0)->MEMBER)
写成这样要好点
那个不是与,失去地址,然后强制转换为 size_t 类型
hunter0022 2007-09-25
  • 打赏
  • 举报
回复
应该是这样就好理解了:(size_t) & ((TYPE*)0)->MEMBER
随后就像楼上的几位兄弟说的,通过偏移取成员再取地址,得其偏移。
当然也可以把0改成任意的数。只不过要将偏移的结果减去这个数。
hunter0022 2007-09-25
  • 打赏
  • 举报
回复
hi,楼主,你看你的宏是不是抄错了呀?size_t是一种类型,怎么可能和一个东西去&呢?
manrenmanren 2007-09-25
  • 打赏
  • 举报
回复
你好像写错了 应该是这样的吧
#define offset(TYPE,MEMBER) (size_t) & (((TYPE*)0))->MEMBER
我啃 2007-09-25
  • 打赏
  • 举报
回复
offsetof
you can find the useful macro in the cstddef
get the offset of a certain filed in the struct
原来百度就这种水平?
lianhd 2007-09-25
  • 打赏
  • 举报
回复
你要是稍微看过一点Linux内核代码, 就明白了呵呵

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧