这几天转到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的内容为空了呢???晕啊!!!
今天又碰到一个,就是理解不了:
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的内容为空了呢???晕啊!!!
recvBuf指针是值向哪个变量?
move之前最最好SetLength(CmdText, recvLen);或者声明时类似var CmdText:String[256];
CopyMemory(@CmdText[1], recvBuf, recvLen );
接受aiirii(ari-http://spaces.msn.com/members/aiirii/) 的批评,
不过我看到说String变量的第1个字节存放的是长度,是真的吗?
还有如果使用Move方法的话,怎么做?
为什么是1而不是0呢?? 总之delphi与其他语言的习惯很是不同,慢慢可能就好了,谢谢大家了。!
然后
recvBuf:=StrAlloc(recvLen);
最后记得释放
StrDispose(RecvBuf);
别用move
直接用强制转化即可