应届生求职招聘论坛

标题: 周立功的一道笔试题---ZZ [打印本页]

作者: candygreen    时间: 2008-10-2 16:53
标题: 周立功的一道笔试题---ZZ
用一个宏定义FIND求一个结构体CTYPE里某个变量CNUM相对了CTYPE的编移量。
如:stuct student
  {
    int a;
    char b[20];
    double ccc;
  }
则:
FIND(student,a); //等于0
FIND(student,b);//等于4
作者: wenzhenyu216    时间: 2008-10-8 19:04
#define FIND(type,member) (&( ((type*)0)->member) )
作者: xiamengzhi    时间: 2009-9-5 17:10
#define FIND(type,member) (&(member)-&(type))
作者: xiamengzhi    时间: 2009-9-5 17:11
#define FIND(type,member) (&(member)-&(type))
作者: crespo1861    时间: 2009-9-6 19:41
#define FIND(type,member) (&(member)-&(type))
xiamengzhi 发表于 2009-9-5 17:10

type在这里是结构体类型,不是一个具体的结构体变量,只定义结构体类型是不分配内存的,怎么能用“&”呢?
作者: soaringchen    时间: 2009-9-7 11:26
2楼的是对的吧。。
作者: Iaybf    时间: 2009-9-12 14:05
二楼答对,
作者: zwclooney    时间: 2009-9-18 21:59
哈哈哈,2楼的说的没错
作者: panobservant    时间: 2009-9-22 10:14
9# zwclooney 我觉得四楼对
作者: buaarpl    时间: 2009-9-22 14:35
大家好,这个答案怎么样:

&(type *)0 -> number - (type *)0
作者: buaarpl    时间: 2009-9-22 15:06
调试通过的代码如下,多加括号没坏处

(char *)&(((type *)0) -> member) - (char *)((type*)0)
作者: ltxings    时间: 2009-10-4 17:08
二楼的可以。
#define FIND(type,member) (int)(&( ((type*)0)->member) )
struct student
{
    int a;
    char b[20];
    double ccc;
};
int main(int argc,char* argv[])
{
        int i=FIND(student,a); //等于0
        i=FIND(student,b);//等于4
        return 0;
}

调试结果是对的。
作者: ltxings    时间: 2009-10-4 17:17
((type*)0)得到一个指向type类型的指针,指针指向的内存单元的地址为:0x00000000
该单元读写时候都会有异常,但是取成员变量的地址时不会有异常。二楼果然厉害。:97)
作者: joycemilo    时间: 2009-10-6 15:24
#define FIND(struc,e) (size_t)&(((struc*)0)->e)
作者: zhanghhustc    时间: 2009-10-20 19:11
佩服啊二楼的兄弟。
作者: liuyang123qq    时间: 2010-9-2 15:42
题目出得很好:
其实就是考下这个宏 offsetof ,定义在文件 stddef.h 中.
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
TYPE是某struct的类型 0是一个假想TYPE类型struct,MEMBER是该struct中的一个成员. 由于该struct的基地址为0, MEMBER的地址就是该成员相对与struct头地址的偏移量.
再往深处,接触过Linux Kernel的会知道这个宏 container_of,就嵌套了宏offsetof ,其在Linux Kernel中的应用非常广泛,它用于获得某结构中某成员的入口地址.




欢迎光临 应届生求职招聘论坛 (https://bbs.yingjiesheng.com/) Powered by Discuz! X3.2