把“0”强制转化为结构体指针类型得到成员变量的偏移量
2017-07-12 22:44
309 查看
#include <stdio.h>
#define OFFSET(TYPE, MEMBER ) &((TYPE *)0)->MEMBER
struct A
{
int a;
char b[20];
double c;
char d;
};
void main()
{
int offsetA= (int ) ( &((A *)0)->a ); //偏移量
int offsetB= (int ) ( OFFSET(A, b) );
int offsetC= (int ) ( &((A *)0)->c );
int offsetD= (int ) ( OFFSET(A, d) );
/* 把“0”强制转化为指针类型,则该指针一定指向“0”(数据段基址)。
因为指针是“A*”型的,所以可取到以“0”为基地址的一个type型变量member域的地址.
那么这个地址也就等于member域到结构体基地址的偏移字节数。
*/
printf("%d ,%d, %d, %d\n", offsetA,offsetB,offsetC ,offsetD );
// 打印 0 ,4, 24, 32
}
#define OFFSET(TYPE, MEMBER ) &((TYPE *)0)->MEMBER
struct A
{
int a;
char b[20];
double c;
char d;
};
void main()
{
int offsetA= (int ) ( &((A *)0)->a ); //偏移量
int offsetB= (int ) ( OFFSET(A, b) );
int offsetC= (int ) ( &((A *)0)->c );
int offsetD= (int ) ( OFFSET(A, d) );
/* 把“0”强制转化为指针类型,则该指针一定指向“0”(数据段基址)。
因为指针是“A*”型的,所以可取到以“0”为基地址的一个type型变量member域的地址.
那么这个地址也就等于member域到结构体基地址的偏移字节数。
*/
printf("%d ,%d, %d, %d\n", offsetA,offsetB,offsetC ,offsetD );
// 打印 0 ,4, 24, 32
}
相关文章推荐
- 结构体中成员变量偏移量
- 结构体指针初始化以及结构体中成员变量是指针的初始化
- 结构体成员变量偏移量的三种解法以及 用宏对成员变量进行修改
- 根据结构体某一成员的地址得到该结构体变量的首地址
- 成员变量为函数指针的结构体的理解
- 结构体struct的应用、结构体变量、结构体指针变量、结构体指针变量类型的区别
- C++ 转换类型运算符 调用构造函数将变量转化成为一个对象的成员变量
- 使用结构体中成员变量指针的教训
- C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员
- 关于空指针类型的类变量的成员函数访问的问题
- 【原】结构体包含CString类型成员变量出错的原理
- 结构体,联合体,枚举.sprintf ,结构体变量和指针成员,->含义
- 强制类型转化 转换是否成功不属于编译器的管辖范围,不合适的类型会让你得到运行时异常
- 用结构体指针指向(->)或结构体变量加点(.)后不出现结构体成员
- 结构体的强制类型转化(android中的代码问题)
- 结构体指针变量与结构体成员指针变量
- 二重指针:结构体指针的指针A** b,其成员变量的调用
- 指针用法之一:给定结构体求某变量的偏移量,给出某变量偏移量求结构体首地址
- osg源码中的ref_ptr operator unspecified_bool_type() 指向类数据成员的指针&类转化为另一类型(如自定义的C类转化为int)
- 成员变量NSString类型指针的属性为什么用copy(属性)