正在获取结构成员崩溃的偏移量
getting offset of struct member crash
据我所知,"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("%pn", &(p->a)); --> 00000000
printf("%pn", &(p->b)); --> 00000004
printf("%pn", &(p->c)); --> 00000008
printf("%pn", &(p->a)); --> 0
printf("%pn", &(p->b)); --> 4
printf("%pn", &(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可以
- 我们为什么要键入cast。必须这样做吗
任何意见都将受到真诚的赞赏:)
据我所知,"offsetof"宏被定义为。。。
事实并非如此,它被定义为。它可以这样定义。通常,在NULL
指针上执行指针运算会导致未定义的行为,但如果您的C库碰巧这样做,那么它在您的特定系统上一定没问题。
顺便说一句,这对我来说也会在带有clang++
的OS X 10.9上崩溃。不过,使用offsetof
时,它不会崩溃。结论:未定义的行为是未定义的,实现细节是实现细节,不应该依赖它们或对它们做出假设。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 使用基地址和偏移量获取变量的地址
- c++ 读取进程内存基址 + 偏移量不起作用
- 通过其在 C 中的偏移量调用函数
- ld:无效的字符串偏移量...对于".strtab"部分
- OpenGL glMultiDrawElements 在索引偏移量上崩溃
- 正在获取结构成员崩溃的偏移量