代码如下:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShareMem;
var
  P: Pchar;
  CSize: Cardinal;
begin
  CSize := MAX_COMPUTERNAME_LENGTH + 1;
  GetMem(P, CSIze);
  GetComputerName(P, CSIze);
  ShowMessage(P);
  FreeMem(P);  
end;执行到ShowMessage的时候提示
Access viloation at Address 20FF49C7 in module "borlnd.mm.dll". Write of Address 00560044uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShareMem;
var
  P: Pchar;
  CSize: Cardinal;
begin
  CSize := MAX_COMPUTERNAME_LENGTH + 1;
  GetMem(P, CSIze);
  P := '4321';
  ShowMessage(P);
  FreeMem(P);  
end;执行到ShowMessage的时候提示
Invalid Pointer operation

解决方案 »

  1.   

    ShowMessage(P); 你想看什么那,pchar 是一个指针,真的是不明白啊,想看地址,还是内容 
      

  2.   

    看内容,Delphi2009中StrPas指针转换为字符串,都是Ansi类型。function StrPas(const Str: PAnsiChar): AnsiString;
    begin
      Result := Str;
    end;
      

  3.   

    VAR
      Pp: PCHAR;
      CSIZE: INTEGER;
    begin
      CSize := 4;
      GetMem(Pp, CSIze);
      strpcopy(pp, 'ssss');
      ShowMessage(Pp);
      freemem(Pp);
    end;这样就不会报错
    你这样赋值是不正确的  P := '4321';
    虽然可以运行,但因为pchar 是一个空结束字符串,与字符产的结构是不同的
      

  4.   

    FreeMem(P);  你是执行这句的时候才报的错
      

  5.   

    上面我指的是第一段代码,第二段代码是错的,应改为:var
      P: Pchar;
      //CSize: Cardinal;
    begin
      //CSize := MAX_COMPUTERNAME_LENGTH + 1;
      //GetMem(P, CSIze);
      P := '4321';
      ShowMessage(P);
      //FreeMem(P);
    end;
      

  6.   

    再说明白一点:var
      P: Pchar; //P 是指针
      CSize: Cardinal;
    begin
      CSize := MAX_COMPUTERNAME_LENGTH + 1;
      GetMem(P, CSIze);//在这里你给 P 分配了一块内存。
      P := '4321'; //这里你将 P 指向另一处含有常量 '4321' 的内存。此时先前给 P 分配的内存
                     //已经成了“孤岛”,就是通常所说的“内存泄漏”。
      ShowMessage(P);
      FreeMem(P); //常量 '4321' 的内存是由系统自动管理的,不允许人工释放。
    end;//下面代码正常:
    var
      P: Pchar; //P 是指针
      CSize: Cardinal;
    begin
      CSize := MAX_COMPUTERNAME_LENGTH + 1;
      GetMem(P, CSIze);//在这里你给 P 分配了一块内存。
      strcopy(P,'4321'); //将常量 '4321' 复制到先前给 P 分配的内存里。
      ShowMessage(P);
      FreeMem(P); //释放给 P 分配的内存。
    end;
      

  7.   

    是执行这句报错的,但为什么FreeMem(P)这个会报错了?
      

  8.   

    第一个代码在DELPHI2009中会报错,谁能解释一下?
      

  9.   

    P := '4321'; //这里你将 P 指向另一处含有常量 '4321' 的内存。此时先前给 P 分配的内存
                     //已经成了“孤岛”,就是通常所说的“内存泄漏”。
    觉得这样解释不是很很好,第一个代码在DELPHI2009中会报错,谁能解释一下?
    你的两个问题实际都是一个问题,要会举一反三
      

  10.   

    感谢你的积极参与,我最终想要的结果是第一个代码能在DELPHI2009中运行。