免费注册 查看新帖 |

Chinaunix

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

[C] 请较大虾们一道公司考试题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-10-18 21:38 |只看该作者
原帖由 funix_zjx 于 2008-10-17 17:55 发表
应该是“&((A *)0->b)”吧

you got it

论坛徽章:
0
12 [报告]
发表于 2008-10-18 21:54 |只看该作者
以前就看到过相关的讨论,只是当时没注意

有人定义宏来获得成员的偏移量

论坛徽章:
0
13 [报告]
发表于 2008-10-18 22:05 |只看该作者
linux中有这样的一个定义
#define offsetof(type, f) ((size_t) \
    ((char *)&((type *)0)->f - (char *)(type *)0))
就是求f在type类型的数据中的偏移量. 你把A,b填入后offsetof(A,b),就会返回变量b在结构体中相对于结构体起始地址的偏移量.
&((type *)0)->f)这条语句跟你这道题的形式相同.就是用0定义一个结构体A的指针,此结构体指针特殊的地方是它指向的结构体的起始地址为0(个人认为((type *)0)语句是这样理解,没有根据^_^)然后用指针取结构体元素b的地址,因为结构体起始地址为0,所以元素b的地址就是它相对于结构体首地址的偏移.

论坛徽章:
0
14 [报告]
发表于 2008-10-18 22:23 |只看该作者
自己想了想,感觉可以用类型来解释。
一个指针(地址)一旦有了类型就指向了一块固定大小的内存。
楼主提到的结构体如下:
struct A
{
   int a;//4byte
  char b;//1byte,但由于要进行对齐,还是占用了2byte
  short c;//2byte(姑且这么认为,但short不一定不int占用的byte少)
}
把0转化为指向A的指针(A*)0,那么对使用(A*)0访问内存时就能访问0x00--0x08的内存区域。
((A*)0)->b是指从起始地址(这里是0x00)+4之后4个字节的区域,
然后取地址&(((A*)0)->b) = 0x04。

把0看做sizeof(A)大小区域的首址,那么0x04的意义,当然就是offset了
我是这么理解的,也不知道对不对,如果有问题还请大虾们指教:wink:

刚才自己试了试,写成&(((A*)0)->b)不是所有的编译器都支持,最起码VC不支持。
要想在所有编译器上都能用,最好选个比较大的地址,比如8888(0x000022B8)
然后把代码改成(char*)(&(((A*)8888)->b)) - (char*)8888,就可以得到offset了。

[ 本帖最后由 kevin20081999 于 2008-10-19 08:15 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-10-18 22:25 |只看该作者
写自己的理解的时候已经有这么多回帖了,呵呵

论坛徽章:
0
16 [报告]
发表于 2008-10-20 01:36 |只看该作者

回复 #10 kevin20081999 的帖子

成员b 在 结构体A中的偏移量。

可直观去理解: &a, 得到是变量a的地址,也就是a的地址相对于地址0的偏移量。

lz的那个写法正好算的是从地址0放一个struct A时,成员b所在的地址。也就是相对于struct A 首地址的偏移量了。

论坛徽章:
0
17 [报告]
发表于 2008-10-20 11:38 |只看该作者
好象明白些什么

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
18 [报告]
发表于 2008-10-20 11:45 |只看该作者
就是偏移量。前段本版块有个帖子就是结构体的元素和偏移量的关系问题

论坛徽章:
0
19 [报告]
发表于 2008-10-20 11:59 |只看该作者
&((A *)0->b)

获取偏移量。

能经常这样考试,很好

论坛徽章:
0
20 [报告]
发表于 2008-10-20 13:18 |只看该作者
原帖由 funix_zjx 于 2008-10-17 17:55 发表
应该是“&((A *)0->b)”吧

对,应该是这样的,楼主应该写错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP