据我所知" 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;
}
我的问题是:
任何意见都非常感谢:)
答案 0 :(得分:0)
据我所知&#34; offsetof&#34;宏被定义为......
不是这样定义的。 可能可以这样定义。通常,对NULL
指针执行指针运算会导致未定义的行为,但如果您的C库碰巧这样做,那么它在您的特定系统上一定很好。
顺便说一句,对于我来说,OS X 10.9上的clang++
也会崩溃。但是,使用offsetof
确实不崩溃。结论:未定义的行为未定义,实现细节是实现细节,您不应该依赖它们或对它们做出假设。