procedure pd(var p:pchar); //过程功能:把字符数组,放到参数p中返回
var
  arrChar:array[0..2] of char;
  i:integer;
  str:string;
begin
  for i:=0 to 2 do
    arrChar[i]:='a'; 
  str:=arrChar;
  p:=PChar(str); //单步执行的时候,这里显示的是3个a,是正确的  
end;
//以下是调用过程pd(var p:pchar);
procedure TForm1.Button3Click(Sender: TObject);
var
  p:pchar;
begin
  pd(p);
  showmessage(strpas(p)); 
  //只显示两个a,但是我利用单步执行,在过程中查看的时候,过程pd中,p是显示3个a.怎么回事???
  //为什么这里只显示两个a???????????
end;不会是电脑出毛病了吧?我重新启动一下电脑看看???

解决方案 »

  1.   

    //如果我不通过过程,直接显示,那么p的内容就是3个a 
    //怎么回事????我重新启动了电脑,问题依旧。
    procedure TForm1.Button2Click(Sender: TObject);
     var
       str:string;
       arrChar: array[0..2] of Char;
       i:integer;
       p:pchar;
    begin
      for i:=0 to 2 do
         arrChar[i]:='5';
      str:=arrChar;
      p:=pchar(str);
      showmessage(strpas(p));
    end;
      

  2.   

    我想在一个过程中,把字符数组的内容放在pchar类型的数据中在怎么做??
    procedure pd(var p:PChar);
    var
      arrChar:array[0..2] of char;
    begin
      for i:=0 to 2 do 
        arrChar[i]:='a';
      //怎么把arrChar的内容赋值给p呀,并能正确返回??? 
    end;
      

  3.   

    我个人的理解,str是局部变量,本身是分配在栈上的,我们不能把字符串转换为PChar再返回,否则离开了该作用域会有未知异常。
      

  4.   

    PChar只是个指针而已 
    退出pd以后str就已经释放了 再使用P结果就成未知了
    给你的P分配内存 然后使用StrCopy
      

  5.   

    晕倒,非要传PChar不可吗?你也可以直接把string传过去,需要的时候再转成PChar就好了。
    比如:
    procedure Test(out s: string);
      

  6.   

    如果你一定要在函数内部生成一个字符串并传回来,那么你需要使用GetMem(p, 3)这样的方式分配内存
    然后对p进行赋值,但是有一点你需要知道,这么分配的内存一定要记得释放FreeMem(p),否则会造成内存泄漏。
    通常情况下,不建议你在函数内分配内存,然后再把内存传出去,而是在调用函数之前分配内存,然后把首地址传进去。
    总之就是在什么地方分配的内存,最还就在什么地方管理并且释放。
      

  7.   

    1、用string类型的参数规避问题,如:
    procedure pd(var outStr: string);
    begin
      //Todo
    end;
    2、可以在函数体里面为pchar指针分配内存,但要约定调用者在调用此函数后要释放这个指针指向的内存空间。如:
    procedure pd(var p:pchar);
    begin
      p := GetMem(...);
      // Todo
    end;调用者代码:
    var
      tempP: pchar;
    begin
      pd(tempP);
      //todo
      FreeMem(tempP);
    end;
    3、由调用者分配足够的内存空间,内存的释放还是由调用者完成。函数体里面只是在这个内存空间里写数据。
      

  8.   

    p:pchar;后面应用中
    getmem(p,10); CopyMemory(p, @arrChar[0], 10);我想把p的位置 指向开始处,方便我再要再拷贝数据
    怎么移动位置??
      

  9.   

    我自己试了一下 
    经过多次赋值后
    如果showmessage(p);
    结果还是正确了
    说明 第二次赋值的时候,不用移动指针谢谢大家指点  问题已经基本上解决了
    结帖 给分