这几天转到delphi上,觉得什么都用着不顺,出现的错误经常是地址越界,当初我转cb的时候也没这么多问题呀。
今天又碰到一个,就是理解不了:
var
    CmdText:String;
    recvBuf:Pointer; 
begin
    ....
    GetMem(recvBuf,recvLen);
    Socket.ReceiveBuf(recvBuf^,recvLen);  
                                          
    move(recvBuf,CmdText,recvLen);        
    ShowMessage(CmdText);
    FreeMem(recvBuf);                     
    ShowMessage(CmdText);    FreeMem之后CmdText内容怎么没有了??
end;move方法不就是按字节复制吗,既然复制到CmdText变量里面了,为什么我释放recvBuf,而CmdText的内容为空了呢???晕啊!!!

解决方案 »

  1.   

    现在没delphi环境,而且你的代码也不全
    recvBuf指针是值向哪个变量?
    move之前最最好SetLength(CmdText, recvLen);或者声明时类似var CmdText:String[256];
      

  2.   

    说明你基础不扎实,犯了些低级错误setLength(CmdText, recvLen + 1);
    CopyMemory(@CmdText[1], recvBuf, recvLen );
      

  3.   

    按着aiirii的方法可以了.
    接受aiirii(ari-http://spaces.msn.com/members/aiirii/) 的批评,
    不过我看到说String变量的第1个字节存放的是长度,是真的吗?
    还有如果使用Move方法的话,怎么做?
      

  4.   

    @CmdText[1]
    为什么是1而不是0呢??  总之delphi与其他语言的习惯很是不同,慢慢可能就好了,谢谢大家了。!
      

  5.   

    把 recvBuf设成Pchar类型
    然后
    recvBuf:=StrAlloc(recvLen);
    最后记得释放
    StrDispose(RecvBuf);
      

  6.   

    (接上)
    别用move
    直接用强制转化即可