涨姿势了
由于内存对齐,C语言中int型数据的指针最低两位一定为0,可以隐藏一个<4的整数,或者表示4种不同的状态。
来一段测试代码。
void
put_data(
int
*p, unsigned
int
data)
{
assert
(data < 4);
*p |= data;
}
unsigned
int
get_data(unsigned
int
p)
{
return
(p & 3);
}
void
cleanse_pointer(
int
*p)
{
*p &= ~3;
}
int
main(
void
)
{
unsigned
int
x = 701;
unsigned
int
p = (unsigned
int
) &x;
printf
(
"Original ptr: %un"
, p);
put_data(&p, 3);
printf
(
"ptr with data: %un"
, p);
printf
(
"data stored in ptr: %un"
, get_data(p));
cleanse_pointer(&p);
printf
(
"Cleansed ptr: %un"
, p);
printf
(
"Dereferencing cleansed ptr: %un"
, *(
int
*)p);
return
0;
}