获取结构指针中的值 问题

jxqn_liu 2012-07-23 02:53:46
//TRecPackHead的声明

PRecPackHead = ^TRecPackHead;
TRecPackHead = record
PackLen : ShortInt;
TransNum : array[0..4] of Char;
ResultNum : array[0..6] of Char;
ResultStr : array[0..40] of Char;
end;


//业务代码

var
PackHead: PRecPackHead;

procedure TRecvThread.Execute;
var
Com, Msg, ResultNum, AType: string;
Len: Integer;
begin
if not frmClient.IdTCPClient.Connected then
begin
Terminate;
Exit;
end;

while (not Terminated) and frmClient.IdTCPClient.Connected do
begin
Msg := frmClient.IdTCPClient.ReadLn('', 5);

if Msg <> '' then
begin
if Msg[1] <> '@' then
begin
frmClient.mmoMsg.Lines.Add(Msg);
end
else
begin
Com := UpperCase(Trim(Copy(Msg, 2, Pos('=', Msg) -2)));
ResultNum := UpperCase(Trim(Copy(Msg, Pos('RESULT', Msg) +7, 4)));
Len := StrToInt(Copy(Msg, Pos('LENGTH', Msg) +7, 6));

if ResultNum = '0000' then
begin
GetMem(PackHead, 56);
frmClient.mmoMsg.Lines.Add(' Msg='+Msg);
frmClient.IdTCPClient.ReadBuffer(PackHead, 56);
AType := PackHead.ResultStr; //错误地址
frmClient.mmoMsg.Lines.Add(' Msg='+Msg);
end;
end;
end;
end;
end;


PackHead是一个指针变量,运行到红色部分的时候出现内存错误!
经用Assigned判断PackHead,不为nil,请问各位大大,这是怎么个情况?

小弟对指针不了解。
...全文
72 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxqn_liu 2012-07-23
  • 打赏
  • 举报
回复
谢谢!
UnkownState 2012-07-23
  • 打赏
  • 举报
回复
你这里没必要使用var
PackHead: PRecPackHead;
直接在TRecvThread定义一个TRecPackHead就好,反正使用。否则自己注意getmem后freemem,运行到使用主线程中的vcl资源应该synchronize
UnkownState 2012-07-23
  • 打赏
  • 举报
回复
frmClient.IdTCPClient.ReadBuffer(PackHead, 56);
改为
frmClient.IdTCPClient.ReadBuffer(PackHead^, 56);


GetMem(PackHead, 56);这样的应该写成SizeOf(TRecPackHead),用的地方都这样写。或者干脆const x= sizeof(xxx)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧