以下算法可以输出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;
}
答案 0 :(得分:0)
在下面的结构中
struct SpecialFlags{
int id;
char flag1;
char flag2;
char flag3;
char flag4;
};
id flag1 flag2 flag3 flag4
--------------------------------------------------
| 99 | 1(49) | 2(50) | 3(51) | 4(52) |
---------------------------------------------------
0x100 0x104 0x105 0x106 0x107 0x108 <--lets say starting address is 0x100
调用ClearFlags()
时st
指向结构的开头。当您执行*(long*)&(st->flag1) = 0;
时,address
的{{1}}转换为st->flags1(char type)
类型,这意味着它将一次获取long*
,最后4 bytes
表示中4个字节的值。
从上图
*
=&gt;从(long*)&(st->flag1)
地址到下一个4字节,直到0x104
0x108
=&gt; *(long*)&(st->flag1)
位置与0x104
位置0x108
=&gt; *(long*)&(st->flag1) = 0
位置与0x104
位置之间的值将被0x108
在此声明之后,您的结构看起来像
0(zero)
现在,当您打印 id flag1 flag2 flag3 flag4
--------------------------------------------------
| 99 | 0(48) | 0(48) | 0(48) | 0(48) |
---------------------------------------------------
0x100 0x104 0x105 0x106 0x107 0x108
,flags.flag1
时,它会打印flags.flag2
。