long b;
b=-1999042505;
byte a[4];
RtlMoveMemory(&a,&b,4);
//a分别是{55,8,217,136}没错
//但是下面
long b;
b=-1999042505;
byte a[5];
a[0]=233;
RtlMoveMemory(&a+1,&b,4);//为什么a分别是{233,204,204,204,204}

解决方案 »

  1.   

    RtlMoveMemory()
    函数功能描述:将一块内存的数据从一个位置复制到另一个位置
      参数
      Destination 
      要复制内存块的目的地址。 
      Source 
      要复制内存块的源地址。 
      Length 
      指定要复制内存块的大小,单位为字节 
      返回值
      该函数为VOID型,没有返回值。
    byte  typedef unsigned char
      

  2.   

    &a不是a这个数组的首地址吗?  按这么推 a+1不就是a[1]的地址吗?
    那么a应该分别是{233,55,8,217,136}
      

  3.   

    你定义的a是一个数据链表
    a本身就是数据链表的首地址
    &a取的是链表首地址的地址,是一个指针的指针
      

  4.   

    明白了 非常谢谢&a[0]是首地址对吗?
      

  5.   

    没错&a[0]就是首地址
    &a[0] = a正确的调用应该是
    RtlMoveMemory(a,&b,4);
    RtlMoveMemory(&a[0],&b,4);
    RtlMoveMemory(a + 1 ,&b,4);
    RtlMoveMemory(&a[1],&b,4);
      

  6.   

    没错&a[0]就是首地址
    &a[0] = a正确的调用应该是
    RtlMoveMemory(a,&b,4);
    RtlMoveMemory(&a[0],&b,4);
    RtlMoveMemory(a + 1 ,&b,4);
    RtlMoveMemory(&a[1],&b,4);
      

  7.   

    刚才调试了一下。知道原因了
    对于byte a[5] 这种标志类型数据的数组,a就是地址。&a是存这个地址的内存区的地址。你第一个例子没有错,可能是因为,系统在用&a时,有某种机制会让它自动转向它所存储的数据。也就是&a可能自动变成了a,
    但是&a+ 1.就没法自动变回去。改成a+ 1就对了。再就是+的运算级别 比&高吧?是不是要加括号,但不加为什么也对呢?LZ的C语言基础不好。另外:如何在console模式下输出 byte类型的数据?我是用debug来看数据。不吝赐教。