procedure f(const data);
begin
  showmessage(string(data));
end;1.直接用常量调用
f('this is test');
出错!2.用变量
var
  s : string;
begin
s := 'this is test';
f(s);
end;调试环境:D6 or D7
为什么呢?

解决方案 »

  1.   

    1.
    f('this is test');
    这种产生的汇编码
    mov eax, $00457798    
    call f//$00457798对应的是串'this is test'在数据段中的偏移量
    在内存中的内容如下
    00457798 74 68 69 73 20 69 73 20 this is 
    004577A0 74 65 73 74 00 00 00 00 test....而f的汇编码
    mov eax, [eax]        //eax实际上为73696874,所以ShowMessage出错,读到了不能读的内存
    call ShowMessage              2.
    var
      s : string;
    begin
    s := 'this is test';
    f(s);
    end;lea eax, [ebp - 4]   //取得s变量的地址传过去,这样读取就正常了
    call f
      

  2.   

    Study :)强:)xzgyb(达摩) 哥哥您是怎么跟踪到的 ?:)
      

  3.   

    to:xzgyb(老达摩)
    厉害!请教了,能否说说是怎么跟踪的吗?另外,问题的核心是:是不是delphi本身的机制造成的?有什么解决方法吗?
      

  4.   

    上午我回贴子了,居然没回上
    wjlsmail(计算机质子)老弟,
    trainman(天龙浪子):
    我就是
    在f处设个断点
    打开CPU窗口就看到了
    CPU窗口的下面部分是内存数据
    就是这些
    另外我觉得
    const就是去变量的地址
    就是按地址传参数
    这样写就造成这种效果
    我也不知道是不是delphi本身的机制造成的
      

  5.   

    const就是去变量的地址
    就是按地址传参数
    --------------------------您说的对, 在函数/过程中传递参数时也是这样的,Const 是传址