利用空指针,返回结构成员在结构中的偏移量
一:代码如下
#include
<
stdio.h
>
typedef struct _bkeydata ... {
unsigned short len; /**//* 00-01: Key/data item length. */
unsigned char type; /**//* 02: Page type AND DELETE FLAG. */
unsigned char data[1]; /**//* Variable length key/data item. */
int i;
int j[5];
} BKEYDATA;
int
main( void )
... {
unsigned short int ioffset,joffset;
//返回i在结构中的offset
ioffset = (unsigned short)(unsigned int)(&(((BKEYDATA *)0)->i));
printf("ioffset = %d ", ioffset); //打印值为4
//返回j[]的0号元组在结构中的offset
joffset = (unsigned short)(unsigned int)(&(((BKEYDATA *)0)->j[0]));
printf("joffset = %d ", joffset); //打印值为8
return 0;
}
typedef struct _bkeydata ... {
unsigned short len; /**//* 00-01: Key/data item length. */
unsigned char type; /**//* 02: Page type AND DELETE FLAG. */
unsigned char data[1]; /**//* Variable length key/data item. */
int i;
int j[5];
} BKEYDATA;
int
main( void )
... {
unsigned short int ioffset,joffset;
//返回i在结构中的offset
ioffset = (unsigned short)(unsigned int)(&(((BKEYDATA *)0)->i));
printf("ioffset = %d ", ioffset); //打印值为4
//返回j[]的0号元组在结构中的offset
joffset = (unsigned short)(unsigned int)(&(((BKEYDATA *)0)->j[0]));
printf("joffset = %d ", joffset); //打印值为8
return 0;
}
二:将该功能封装为宏
#include
<
stdio.h
>
// 将指针转化为无符号短整型
#define P_TO_UINT16(p) ((unsigned short)(unsigned int)(p))
// 返回结构成员在结构中的偏移量:适合于非数组成员
#undef SSZ
#define SSZ(name, field) P_TO_UINT16(&(((name *)0)->field))
// 返回结构成员数组0号元组在结构中的偏移量:适合于数组成员,如j[5]
#undef SSZA
#define SSZA(name, field) P_TO_UINT16(&(((name *)0)->field[0]))
typedef struct _bkeydata ... {
unsigned short len; /**//* 00-01: Key/data item length. */
unsigned char type; /**//* 02: Page type AND DELETE FLAG. */
unsigned char data[1]; /**//* Variable length key/data item. */
int i;
int j[5];
} BKEYDATA;
int
main( void )
... {
unsigned short int ioffset,joffset;
//返回i在结构中的offset
ioffset = SSZ(BKEYDATA, i);
printf("ioffset = %d ", ioffset);
//返回j[]的0号元组在结构中的offset
joffset = SSZA(BKEYDATA, j);
printf("joffset = %d ", joffset);
return 0;
}
// 将指针转化为无符号短整型
#define P_TO_UINT16(p) ((unsigned short)(unsigned int)(p))
// 返回结构成员在结构中的偏移量:适合于非数组成员
#undef SSZ
#define SSZ(name, field) P_TO_UINT16(&(((name *)0)->field))
// 返回结构成员数组0号元组在结构中的偏移量:适合于数组成员,如j[5]
#undef SSZA
#define SSZA(name, field) P_TO_UINT16(&(((name *)0)->field[0]))
typedef struct _bkeydata ... {
unsigned short len; /**//* 00-01: Key/data item length. */
unsigned char type; /**//* 02: Page type AND DELETE FLAG. */
unsigned char data[1]; /**//* Variable length key/data item. */
int i;
int j[5];
} BKEYDATA;
int
main( void )
... {
unsigned short int ioffset,joffset;
//返回i在结构中的offset
ioffset = SSZ(BKEYDATA, i);
printf("ioffset = %d ", ioffset);
//返回j[]的0号元组在结构中的offset
joffset = SSZA(BKEYDATA, j);
printf("joffset = %d ", joffset);
return 0;
}