用于在一个步骤中设置Structure的成员变量的内存利用

时间:2018-02-21 14:05:13

标签: c++ pointers

以下算法可以输出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;
}

1 个答案:

答案 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