var
  tmp : array of pchar;
  i : byte;
begin
  setlength(tmp,4);
  for i := 0 to 3 do
  begin
    tmp[i] := pchar(IntToStr(i));
    memo1.lines.Add(tmp[i]^);
  end;
  form1.Memo1.Lines.Add('-----');
  for i := low(tmp) to high(tmp) do
  begin
    form1.Memo1.Lines.Add(tmp[i]^);
  end;输出结果
0
1
2
3
-----
3
3
3
3
不是很明白,第一次为什么正确,后面一次为什么会错误?

解决方案 »

  1.   

    数组tmp里的元毒都指向了同一个地址
      

  2.   

    //-_-# 参考下面的代码
    //编译器没有这样智能
    //这样的内存空间需要自己处理
    //不是一个简单的强制转换就搞定的procedure TForm1.Button1Click(Sender: TObject);
    var
      tmp: array of PChar;
      i: Byte;
      s: string;
    begin
      SetLength(tmp, 4);
      for i := 0 to 3 do
      begin
        s := IntToStr(I);
        GetMem(tmp[i], Length(s) + 1);
        Move(s[1], tmp[i]^, Length(s) + 1);
        Memo1.Lines.Add(tmp[i]);
      end;
      Memo1.Lines.Add('-----');
      for i := low(tmp) to high(tmp) do
      begin
        Memo1.Lines.Add(tmp[i]);
        FreeMem(tmp[i], StrLen(tmp[i]) + 1);
      end;
    end;
      

  3.   

    tmp : array of pchar;
    setlength(tmp,4);这是主要的问题,TMP[N]本来就需要自已申请间或指向已有空间!
    setlength(tmp,4);这只是对TMP数组指定了空间,而同时TMP[0..3]每一个元素确只是一个指针而已!
      

  4.   

    zswang(伴水清清)(专家门诊清洁工) 的方法是正确的,
    PChar只是指针,要分配内存才行:var
      tmp : array of PChar;
      i : byte;
    begin
      SetLength(tmp,4);
      for i := 0 to 3 do
      begin
        //tmp[i] := pchar(IntToStr(i));
        GetMem(tmp[i],Length(IntToStr(i))+1);
        tmp[i] := StrCopy(tmp[i],PChar(IntToStr(i)));
        memo1.lines.Add(tmp[i]^);
      end;
      form1.Memo1.Lines.Add('-----');
      for i := low(tmp) to high(tmp) do
      begin
        form1.Memo1.Lines.Add(tmp[i]);
      end;
      

  5.   

    D5开发指南上面的原话,摘录如下:

      当使用PChar类型的变量时,经常会出现指针错误。由于Pchar是一个指向字符串的指针,因此必须用StrAlloc(),GetMem(),StrNew(),GlobalAlloc()或virtualAlloc()来为PChar分配内存,同时还要用StrDispose(),FreeMem(),GlobalFree()或VirtualFree()来释放内存.  提示: 你最好尽可能地使用String而不是PChar,这样可以避免潜在的缺陷.如果需要的话,可以把String强制转换为PChar.由于String是自动分配内存和释放内存的,根本没必要管内存的分配问题.
      

  6.   

    用array of string 就可以解决你的问题啦。
    pchar只是一个指向#0结束字符的指针。
      

  7.   

    请问例子中最后该怎么释放?
      SetLength(tmp,0); ? 
    或者
      FillChar(tmp, SizeOf(tmp), 0);
    或者
      for i := Low(tmp) to High(tmp) do
        FreeMem(tmp[i]);
    还是别的组合?
      

  8.   

    你指针没分配内存
    var
        tmp: array   of   pchar;
        i   :   byte;
    begin
        setlength(tmp,4);
        for   i   :=   0   to   3   do
        begin
            GetMem(tmp[I], 100);
            StrCopy(tmp[I], pchar(IntToStr(i)));
            memo1.lines.Add(tmp[i]);
        end;
        form1.Memo1.Lines.Add( '----- ');    for i  :=   low(tmp)   to   high(tmp)   do
        begin
            form1.Memo1.Lines.Add(tmp[i]);
        end;end;要不你把 tmp   :   array   of   pchar;  改成 tmp   :   array   of   string;
    就可以了 
      

  9.   

    pchar(IntToStr(i));
    返回一个临时字符串的首字符地址
    至于这个临时字符串的空间什么时候被重用、回收,都无法预料了