应届生求职招聘论坛
标题:
周立功的一道笔试题---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