procedure TForm1.Button1Click(Sender: TObject);
var
  aaa,bbb,ccc:PChar;
  str:String;
begin
  str:='aaaaa';
  GetMem(aaa,Length(str));
  GetMem(bbb,Length(str));
  GetMem(ccc,Length(str));
  Move(str[1],aaa^,length(str));
  Move(str[1],bbb^,Length(str));
  Move(str[1],ccc^,Length(str));  showmessage(aaa);   //显示为 aaaaa
  showmessage(bbb);   //显示为 aaaaa+乱码     //错误
  showmessage(ccc);   //显示为 aaaaa  showmessage(IntToStr(StrLen(aaa)));   //显示长度为 5
  showmessage(IntToStr(StrLen(bbb)));   //显示长度为 9   //错误
  showmessage(IntToStr(StrLen(ccc)));   //显示长度为 5  FreeMem(aaa);
  FreeMem(bbb);
  FreeMem(ccc);
end;为什么上面bbb会出错,我使用的是 Delphi 7,求高手帮忙解决,谢谢

解决方案 »

  1.   

    这段代码放在Button下当第二次点击时,全部正常,但每次重开程序,问题总是会出现
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      aaa,bbb,ccc:PChar;
      str:String;
    begin
      str:= 'aaaaa';
      GetMem(aaa,Length(str));
      Move(str[1],aaa^,length(str));  GetMem(bbb,Length(str));
      Move(str[1],bbb^,Length(str));  GetMem(ccc,Length(str));
      //Move(str[1],aaa^,length(str));
      //Move(str[1],bbb^,Length(str));
      Move(str[1],ccc^,Length(str));  showmessage(aaa);   //显示为 aaaaa
      showmessage(bbb);   //显示为 aaaaa+乱码     //错误
      showmessage(ccc);   //显示为 aaaaa  showmessage(IntToStr(StrLen(aaa)));   //显示长度为 5
      showmessage(IntToStr(StrLen(bbb)));   //显示长度为 9   //错误
      showmessage(IntToStr(StrLen(ccc)));   //显示长度为 5  FreeMem(aaa);
      FreeMem(bbb);
      FreeMem(ccc);
    end;LZ这样写就没有问题了...
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      aaa,bbb,ccc:PChar;
      str:String;
    begin
      str:= 'aaaaa';
      GetMem(aaa,Length(str));
      Move(str[1],aaa^,length(str));  GetMem(bbb,Length(str));
      Move(str[1],bbb^,Length(str));  GetMem(ccc,Length(str));
      //Move(str[1],aaa^,length(str));
      //Move(str[1],bbb^,Length(str));
      Move(str[1],ccc^,Length(str));  showmessage(aaa);   //显示为 aaaaa
      showmessage(bbb);   //显示为 aaaaa
      showmessage(ccc);   //显示为 aaaaa  showmessage(IntToStr(StrLen(aaa)));   //显示长度为 5
      showmessage(IntToStr(StrLen(bbb)));   //显示长度为 5   
      showmessage(IntToStr(StrLen(ccc)));   //显示长度为 5  FreeMem(aaa);
      FreeMem(bbb);
      FreeMem(ccc);
    end;LZ这样写就没有问题了...
      

  4.   

    length是5,GetMem时分配到了一个5字节的内存,但是字符串的末尾都有一个空字符表示结尾,所以str的大小实际是6字节,当move是没有把这个结束附考过来,所以程序会继续往下读,直到出现一个空终止附,改成下面的就对了.
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      aaa,bbb,ccc:PChar; 
      str:String; 
    begin 
      str:='aaaaa';
      (aaa,length(str)+1);
      GetMem(bbb,length(str)+1);
      GetMem(ccc,length(str)+1);
      Move(str[1],aaa^,length(str)+1);
      Move(str[1],bbb^,length(str)+1);
      Move(str[1],ccc^,length(str)+1);  showmessage(aaa);   //显示为 aaaaa
      showmessage(bbb);   //显示为 aaaaa+乱码     //错误
      showmessage(ccc);   //显示为 aaaaa  showmessage(IntToStr(StrLen(aaa)));   //显示长度为 5 
      showmessage(IntToStr(StrLen(bbb)));   //显示长度为 9   //错误 
      showmessage(IntToStr(StrLen(ccc)));   //显示长度为 5   FreeMem(aaa); 
      FreeMem(bbb); 
      FreeMem(ccc); 
    end; 
    可以结贴了吧?