procedure TInterfaceFrm.Button7Click(Sender: TObject);
var
  vWrtie: Cardinal;
  vTmpStr: String;
  vPointer: Pointer;
  vSize, vTwoSize: Integer;
begin
  vTmpStr := '你好看看啊';
  vSize := length(vTmpStr);
  vPointer := HeapAlloc(FMemHeap, $8, vSize);
  ZeroMemory(vPointer, vSize);
  Move(PChar(vTmpStr)^, vPointer^, vSize);
  vTmpStr := PChar(vPointer);
  ShowMessage(vTmpStr);
  HeapFree(FMemHeap, 0, vPointer);
  vPointer := nil;
end;如上简短的代码,vPointer 为什么会出现得到结果是这个: '你好看看啊铪铪铪'
也就是后面多了个尾巴,那位大牛解析一下!

解决方案 »

  1.   

    申请到的内存未做初始化,而你move操作的时候并没有把字符串结束符#0复制过来,因此字符串的结束位置是未知的,甚至可能会远远超出HeadAlloc所申请的空间。
      

  2.   

    ZeroMemory(vPointer, vSize);
    我这里不就是做初始化了吗??
    没有符串结束符#0这个倒是真的啊! 这个重要。 
      

  3.   

    var
      vSize: Integer;
      vTmpStr: String;
      vPointer: Pointer;
    begin
      vTmpStr := '你好看看啊';
      vSize := length(vTmpStr);
      vPointer := HeapAlloc(FMemHeap, $8, vSize + 1);
      Move(PChar(vTmpStr)^, vPointer^, vSize);
      vTmpStr := PChar(vPointer);
      ShowMessage(vTmpStr);
      HeapFree(FMemHeap, 0, vPointer);
      vPointer := nil;
    end;
    呵呵,这样就解决了,谢谢unsigned(僵哥(自然界因不公平生生不息)) 的指导
    1. 其实HeapAlloc(FMemHeap, $8, vSize + 1); $8是就是把内存清零操作了。
    2. 所以在申请内存的时候多申请一个存储#0解决问题