【发布时间】:2018-08-01 03:37:47
【问题描述】:
下面的算法可以输出99 0000
请告诉我下面这行代码是如何工作的?
*(long*)&(st->flag1) = 0;
算法是:
#include <stdio.h>
struct SpecialFlags{
int id;
char flag1;
char flag2;
char flag3;
char flag4;
};
void ClearFlags( SpecialFlags *st )
{
*(long*)&(st->flag1) = 0;
}
int main(void)
{
SpecialFlags flags;
flags.id = 99;
flags.flag1 = 1;
flags.flag2 = 2;
flags.flag3 = 3;
flags.flag4 = 4;
ClearFlags( &flags );
printf( "%d %d%d%d%d\n", flags.id,
flags.flag1, flags.flag2,
flags.flag3, flags.flag4 );
return 0;
}
【问题讨论】:
-
它将最后一颗钉子钉入未定义的棺材。
-
从右到左阅读。获取
st->flag1的地址(&),将其转换为long*,然后取消引用(*)该指针。写这句话的人把它用作一个可怕的黑客,将所有四个flags 设置为 0。 -
@0x5453
&这里取的是地址,不是引用 -
...**if**
sizeof long实际上是 4... -
@DevSolar 我错过了您评论中的
if。