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
为什么呢?
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
为什么呢?
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
厉害!请教了,能否说说是怎么跟踪的吗?另外,问题的核心是:是不是delphi本身的机制造成的?有什么解决方法吗?
wjlsmail(计算机质子)老弟,
trainman(天龙浪子):
我就是
在f处设个断点
打开CPU窗口就看到了
CPU窗口的下面部分是内存数据
就是这些
另外我觉得
const就是去变量的地址
就是按地址传参数
这样写就造成这种效果
我也不知道是不是delphi本身的机制造成的
就是按地址传参数
--------------------------您说的对, 在函数/过程中传递参数时也是这样的,Const 是传址