请看下面的代码:
-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
    lpData,pch:PChar;
    str       :String;
    stream    :TMemoryStream;
begin
    //为了测试,先分配一个字符串常量
    str:='This is a string.And This is an extra string.';
    pch:=@str[1];  //首先直接把字符指针指向一个字符串常量    GetMem(lpData,Length(pch));        //分配空间
    CopyMemory(lpData,pch,Length(pch));//复制内存块    //将复制过来的内存块写到内存流中
    stream:=TMemoryStream.Create;
    stream.Write(PChar(lpData),Length(lpData));    //释放掉内存块,然后重新分配空间...
    FreeMem(lpData);
    GetMem(lpData,stream.Size);    //从内存流中回写到新分配的内存块中
    stream.Position:=0;
    stream.Read(lpData,stream.Size);    //为什么这里得到的lpData是乱码,而且长度只有 5 ?
    ShowMessage(lpData+'    长度:'+IntToStr(Length(lpData)));    //为什么这里保存得到的文件中虽然是45个字节
    //但是也是乱码??
    stream.SaveToFile('D:\a.txt');
    //...
    //最后做一些释放清除操作等
end;
-------------------------------------------------------------------------
为什么 lpData 释放后又重新分配空间就不行了呢?
而且用流直接保存成文本文件,得到的是乱码,是怎么回事?怎么解决?
哪位高手帮小弟解决一下,先谢过了!

解决方案 »

  1.   

    var
        lpData,pch:PChar;
        str       :String;
        stream    :TMemoryStream;
    begin    str:='This is a string.And This is an extra string.';
    //    pch:=@str[1]; //這句錯了, 不能這樣    GetMem(lpData,Length(str) + 1);
        //CopyMemory(lpData,pch,Length(pch));
        CopyMemory(lpData, @str[1], Length(str));    stream:=TMemoryStream.Create;    stream.Write(lpData^, Length(lpData));
        FreeMem(lpData);
        GetMem(lpData,stream.Size);
        stream.Position:=0;
        stream.Read(lpData^, stream.Size);
        ShowMessage(strpas(lpData)+ ' -- Len: '+IntToStr(Length(lpData))); //   stream.SaveToFile('D:\a.txt');
        stream.Free;
    end;
      

  2.   

    pch:=@str[1]; 这一句有问题,因为str不是零结尾的字符串表示形式,串长是放在str[0]中的。改成:
    pch := PChar(str);stream.Write(PChar(lpData),Length(lpData)); 也有问题,lpData本身就是PChar,难道还要PChar()一下?其他的没有看了。
      

  3.   

    谢谢  aiirii(ari-爱的眼睛) 
    小弟受教了原来是 
    stream.Write(lpData^, Length(lpData));

    stream.Write(lpData, Length(lpData));
    的不同.Write的参数1是指针类型的啊,我一直弄混了.顺便请问一下:
    stream.Write(lpData^, Length(lpData));

    stream.Write(lpData, Length(lpData));
    有什么不同呢?麻烦给我解释清楚点好吗?免得我以后又犯同类错误.
      

  4.   

    恩,刚刷新看到  ddqqyy(ddqqyy) 的回复,
    也谢谢  ddqqyy(ddqqyy)
      

  5.   

    >>有什么不同呢?麻烦给我解释清楚点好吗?免得我以后又犯同类错误.
    lpData 是指針地址, 
     lpData^ 是這個指針引用的內容
      

  6.   

    不知你代碼的意思, 但這裹, pch:PChar; 是不必要的
      

  7.   

    谢谢 aiirii(ari-爱的眼睛) 的悉心辅导,顺便问问,你的信誉分怎么那么高啊~~同时也谢谢各位