空指针的利用

利用空指针,返回结构成员在结构中的偏移量

 

一:代码如下
#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;
}
 
二:将该功能封装为宏
 
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值