2007年10月17日星期三

泰鼎的一道笔试题:结构体相关

在中括号里补充语句,使程序完整
typdedef struct _A{
    ...  ... // some definitions
    int x;
    ...  ... // some definitions
    int y;
}A

void foo(int *px)
{
    //print the value of y
   【                    】
}

void main()
{
    A *a = ( A *) malloc (sizeof(A));

    if ( a == NULL )
       return ;
    foo( &(a->x));
}

此处的问题是如何通过结构体内一个成员变量的地址,找到另一个成员变量的地址。
当时没有思路。
下来看别人讨论才知道怎么回事,
可以再定义一个A b;
那么 &b.y-&b.x即y与x之间的偏移。
printf("%d",*(px+(&b.y-&b.x)));
就可以打印出y的值。

在 C语言中有个offsetof函数
用来计算结构体中成员变量的偏移,

下面一段内容来自 http://www.2.newsmth.net/bbscon.php?bid=332&id=390&ftype=3&num=39
start
5. offsetof
常见的 offset 定义
#define offsetof(s, m) ((unsigned) &((s*)0)->m)
问题1:标准要求 offsetof 的结果是 size_t 类型,unsigned 不一定等同于 size_t
即便改成用 size_t
#define offsetof(s, m) ((size_t) &((s*)0)->m)
在 C++ 中,由于 & 运算符可以被重载,因此这样的 offsetof 得到的结果仍然可能是
错的。

gcc 3 给的答案颇为复杂:
#ifndef __cplusplus
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#else
/* The cast to "char &" below avoids problems with user-defined
   "operator &", which can appear in a POD type.  */
#define offsetof(TYPE, MEMBER)                  \
  (__offsetof__ (reinterpret_cast <size_t>          \
                 (&reinterpret_cast <const volatile char &> \
                  (static_cast<TYPE *> (0)->MEMBER))))

没有评论: