我用的是delphi Enterprise 6.0 build6.163 + update 2 + Run-Time Lib Patch 2   
win98third下安装 默认设置该程序用到一个memo1,一个button1,一个button2。
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
var pch: pchar;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  Pc: PChar;
  S: String;begin
  S := 'helloworld';
  memo1.Lines.Add(s + '   :S的内容');
  Memo1.Lines.Add(IntToStr(Integer(@S)) + '   :S的地址');
  Pc := PChar(S);
  memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');
  //Pc := 'kkkkkk';
  memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');
  S := '1234567890';  //Pc := 'FFFFFF';
  Memo1.Lines.Add(pc^ + '   :Pc^的值');
  Memo1.Lines.Add(pc + '   :Pc的值');
  memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');
  pc^ := 'C';
  Memo1.Lines.Add(pc^ + '   :Pc^的值');
  Memo1.Lines.Add(pc + '   :Pc的值');
  memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');
  memo1.Lines.Add(s + '   :S的内容');
  Memo1.Lines.Add(IntToStr(Integer(@S)) + '   :S的地址');
  pch := pchar(s);
  memo1.Lines.Add(pch +'   :pch的内容');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  memo1.Lines.Add(pch +'   :pch的内容');
end;end.这个程序在Delphi中运行时(F9),按button1,按button2都很正常,但是当直接双击执行已生成的Project1.exe并按button1时却报错:
“Access violation at address 00457751 in module 'project1.exe'. Write of address 00457894.”
按button2没事。
怪死了,为什么脱离Delphi就会报错?

解决方案 »

  1.   

    估计是你pc^ := 'C';这句错了,只是在集成环境下有内存保护机制所以没有报错!
      

  2.   

    redhf(农民的儿子) 
    说的对,只在集成环境下测试看来是不保险的!
    但是为何会错呢,对指针的动态变量赋值有错吗?
      

  3.   

    加几句showmessage看看到底是哪一句出错
      

  4.   

    在编译器下按f9也出错啊
    怎么试的
    pc^ := 'C';
    你能给一个常量赋值么?
      

  5.   

    pc不是常量!你把pc^注释掉看看
      

  6.   

    首先,不管是哪里有错误,Delphi我想肯定会报错的;如果没有报错,那么最可能的原因是:在你按F9运行的时候,然后你点击按扭后,你不要太快结束程序了,你需要等上几分钟
      

  7.   

    pc^ := 'C';这句的毛病
      

  8.   

    我估计是因为指针类型的问题,因为一般情况下使用Pchar类型(指针),最好是使用New并且Free,或者不要忘记最后释放或者设置为Nil。
    另外,一般PChar类型的指针是以0为字符串的末尾的。因此如果你乱赋值的话就会出错了。因此可以说你的程序中致命的错误就是pc^:=C。内存乱套了。呵呵。
      

  9.   

    我认为pc^ := 'C';逻辑上应该是没有错,因为pc^ 应该代表的是pchar的第一个字符。用pc^ := 'C';来改变这个字符讲不通吗?
      

  10.   

    首先,
    Memo1.Lines.Add(IntToStr(Integer(@S)) + '   :S的地址');
    不能得到S的地址,应该是
    Memo1.Lines.Add(IntToStr(Integer(@S[1])) + '   :S的地址');因为本质上,S也是一个指针,@S是S这个变量的地址。其实,pc就是指向S[1]的。然后,我发现一个很有趣的事实:
    一旦引用了s[n]这样的语句,S指向的地址发生了变化!
    请比较这两段程序:
      S := 'helloworld';
      memo1.Lines.Add(s + '   :S的内容');
      Memo1.Lines.Add(IntToStr(Integer(@S[1])) + '   :S的地址');
      Pc := PChar(S);
      memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');

      S := 'helloworld';
      memo1.Lines.Add(s + '   :S的内容');
      Pc := PChar(S);
      Memo1.Lines.Add(IntToStr(Integer(@S[1])) + '   :S的地址');
      memo1.Lines.Add(inttostr(integer(@pc^)) + '   :Pc的地址');仅仅是顺序不同,S和PC的地址就不一样!如果使用第一种方式,在以后的语句中,pc^:='C'就没有错。第二种方式就有错。所以我有以下的猜想:
    S在没有被s[n]的方式(可能还有其他方式)引用前,是指向一个常量的空间,一旦被引用后,Delphi把常量空间中的字符串拷贝到变量空间中,并且S指向它。所以,之所以楼主的程序 pc^:='C'出错,是因为此时pc指向的是常量空间,不可写。加入在此语句前加入 s[1]:='a' 这样的语句,就不会出错了!
      

  11.   

    指针非常难调试的,之所以会编译可以执行,是不是跟你dephi设置的环境有关系啊
      

  12.   

    PC本身就是指针,PC^的意思是PC指向的地址, 这个值是不能改变的。而PC就是指向这一地址的首地址。
    当然 PC^:= 'C'出错。
      

  13.   

    to:GoldProgramer() 
    我觉得你说的不对。