procedure TForm1.Button1Click(Sender: TObject);
var
  Buf: array[0..9] of AnsiChar;
  DataBuffer: pchar;
  len: Integer;
begin
 buf:='012345678';
 len:=Length(buf);
 GetMem(DataBuffer, len);
  try
    CopyMemory(DataBuffer, @Buf, len);
    DataBuffer:=pchar('<test>'+DataBuffer);
    len:=Length(DataBuffer);
    //ReallocMemory(@Buf, len);//这里不知道是不是这样操作的
    CopyMemory(@Buf, DataBuffer, len);
  finally
    FreeMem(DataBuffer);
  end;
  ShowMessage(buf);
end请问各位朋友,如何将新的DataBuffer值放到Buf里面,上面的操作时错误的咯,

解决方案 »

  1.   

    下面是依据你的函数修正的,因为不知道你要完成什么功能,因此,仅仅是指出了你程序中的错误。
    下面修改后的程序,不一定能完成你的功能,但是程序师正确的procedure TForm1.Button1Click(Sender: TObject);
    var
      Buf: array[0..9] of AnsiChar;
      DataBuffer: PChar;
      len: Integer;
    begin
      buf := '012345678';
      len := Length(buf);
      GetMem(DataBuffer, len);
      try
        //CopyMemory(DataBuffer, @Buf, len); 这句换成下面这句
        Move(Buf[0], DataBuffer^, Len);    //DataBuffer:=pchar('<test>'+DataBuffer);  //这句是错误的,会导致刚刚用 GetMem 申请的内存丢失
        //上面这句也超长了,len 是 10,因此DataBuffer也只有10个字节的长度
        //应该换成下面这句
        Move(PChar('<test>' + DataBuffer)^, DataBuffer^, Len);
        //上面这句 move 实际上也是有问题的,因为PChar类型的数据需要以 #0来标识其结尾,
        //上面这句吧DataBuffer都用数据填满了,这是危险的,如果以 DataBuffer 为参数调用操作 PChar 的函数可能会导致未知的错误
        //例如 StrLen(DataBuffer) ,就可能返回大于10的一个数,这是不正确的
        //但是因为下面的应用没有这样的函数调用操作,因此在这里,上面的这句move不会有问题    //len:=Length(DataBuffer); //这句也是错误的,PChar 类型的字符串使用 StrLen() 函数获得其字符串长度
        //因为 DataBuffer 在前分配的内存大小是10字节,因此上面这句也是没有必要的
        //ReallocMemory(@Buf, len);//这里不知道是不是这样操作的
        //上面这句也是错误的,buf是栈中分配的内存,是不能通过 ReallocMemory 函数重新分配内存大小的
        //只有在堆中分配的内存,才能使用 ReallocMemory 来重新分配内存    //CopyMemory(@Buf, DataBuffer, len); 这句换成下面这句
        Move(DataBuffer^, Buf[0], Len);  finally
        FreeMem(DataBuffer);
      end;
      ShowMessage(buf);
    end;上面的注释够详细了,呵呵
      

  2.   

    如果你想得到一个能动态改变大小的字符数组,那这样:
    var
      buf: array of AnsiChar;
    begin
      //分配一个包含10个字符的数组,从buf[0] 到 buf[9]
      SetLength(Buf, 10);
      ......
      //如果要重新设置数组的大小,则
      SetLength(Buf, 20);
      //上面是改变buf大小为包含20个字符的数组,从buf[0]到buf[19]  //缩小buf数组,下面是重新设置数组为包含8个字符的数组
      SetLength(Buf, 8);  //动态数组不需要用户主动去释放其所占用的内存,函数结束的时候,系统会自动回收动态数组占用的内存
    end;