b_send: array of Byte; 
SetLength(b_send,4); 
len :=Htonl(len); 
p_int := @len; 
Move(p_int^,b_send,SizeOf(Byte) * 4);运行后会发生内存错,如果在move里改成b_send[0],就没有内存错,但是b_send的值就不正确。请高手帮助。谢谢。

解决方案 »

  1.   

    p_int是PInteger? 注意这是4字节是低位在前高位在后, Move写入数组的是高位在前低位在后,可能是这个原因
      

  2.   

    你有什么错呢,b_send不是[224,0,0,0]吗
      

  3.   

    p_int: ^Integer;
    move是地址传递吧。我直接用len做move的参数也不行,也报内存错。
      

  4.   

    Access violation at address 00405238 in module 'Project1.exe'. Write of address DFFFFFF8
    报这个东东
      

  5.   

    我的整个流程是这样的:
    先生成一个ms := TMemoryStream.Create;
    之后将一个数据放到数组中Move(p_int^,b_send,SizeOf(Byte) * 4);
    再把数组写入到流中ms.WriteBuffer(b_send,4);
    之后发送流ms.Position := 0;
             Socket.SendStream(ms);
    但是最后ms.Free;也报内存错。
    所以现在,move也报,ms.free也报。都是内存错。请帮忙看看。谢谢。
      

  6.   

    Move(p_int^,b_send,SizeOf(Byte) * 4);
    改成
    Move(p_int^,b_send[0],SizeOf(Byte) * 4);ms.free这个内存错跟网络有关,Socket.SendStream(ms); 这句还没有发出去,就执行下一句free导致报错,不用Free就会内存泄露,所以发送数据尽量不用SendStream
      

  7.   

    改成Move(p_int^,b_send[0],SizeOf(Byte) * 4);的确不报内存错。只是传的数据不对。为一个很大的负数。只有Move(p_int^,b_send,SizeOf(Byte) * 4);数据才正确,但是内存错。
      

  8.   

    我这个消息是发送给java服务器的。java服务器也是socket,但是接收只有Move(p_int^,b_send,SizeOf(Byte) * 4);数据才正确。但是delphi这边却报内存错。
      

  9.   

    如果你是要完成功能,那根本不用move函数var
      b_send: array of Byte;  
    begin
      SetLength(b_send,4);  
      len :=Htonl(len);  
      PInteger(@b_send[0])^ := Len;
      ......
      //读取
      Len := PInteger(@b_send[0])^;
    end;如果你要向流中写内容,那连数组都省了
      ms.Write(Len, SizeOf(Len))
    这就可以了,读的时候
      ms.Read(Len, SizeOf(Len));
      

  10.   

    如果你一定要用move,那么下面有个例子,你自己对照下,根本就不需要你那么多转换步骤var
      a: array of Byte;
      b: Integer;
    begin
      SetLength(a, 4);
      PInteger(@a[0])^ := 224;
      b := 12234;
      Move(b, a[0], 4);
      b := 0;
      Move(a[0], b, 4);
      showmessage(IntToStr(b))
    end;
      

  11.   

    其实这个问题也跟delphi和java通讯有关,我如果用sendbuf发出的是[0,0,0,224]。java那边接收的却是[24,72,-103,0]。很奇怪。
      

  12.   

    明显是你sendbuf用错了,你把要发送的数据的数据地址发出去了,而不是把数据本身发出去了,你这次发送的信息比较特殊,正好待发送的数据也是4个字节,所以你觉得奇怪。
      

  13.   

    Move(p_int^,(@b_send[0])^,SizeOf(Byte) * 4);
      

  14.   

    动态数组b_send的地址跟数组首地址并不同,调试可以看出来。