获得结构成员崩溃的偏移量

时间:2014-04-17 15:47:23

标签: c++ printf cout offsetof

据我所知" offsetof"宏定义为:

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

基于此链接:http://en.wikipedia.org/wiki/Offsetof

所以我编写自己的代码片段来计算结构成员的偏移量:

typedef struct{
    char a;
    int b;
    int c;
}example_struct;

int main(int argc, char *argv[])
{
    example_struct *p = 0;

    printf("%p\n", &(p->a));        --> 00000000
    printf("%p\n", &(p->b));        --> 00000004
    printf("%p\n", &(p->c));        --> 00000008

    printf("%p\n", &(p->a));        --> 0
    printf("%p\n", &(p->b));        --> 4
    printf("%p\n", &(p->c));        --> 8

    cout << &(p->a);        --> this line cause crash ???
    cout << &(p->b);        --> 00000004
    cout << &(p->c);        --> 00000008

    cout << (unsigned int)&(p->a);        --> 0
    cout << (unsigned int)&(p->b);        --> 4
    cout << (unsigned int)&(p->c);        --> 8

    return 0;
}

我的问题是:

  • 类型转换是否会导致崩溃。为什么不能判断第一个成员的偏移量,但是printf可以吗?
  • 我们为什么要输唱。这是必须的吗?

任何意见都非常感谢:)

1 个答案:

答案 0 :(得分:0)

  

据我所知&#34; offsetof&#34;宏被定义为......

不是这样定义的。 可能可以这样定义。通常,对NULL指针执行指针运算会导致未定义的行为,但如果您的C库碰巧这样做,那么它在您的特定系统上一定很好。

顺便说一句,对于我来说,OS X 10.9上的clang++也会崩溃。但是,使用offsetof确实崩溃。结论:未定义的行为未定义,实现细节是实现细节,您不应该依赖它们或对它们做出假设。