无用的技巧:消灭const 字符串参数的内容。(0分)

  • 主题发起人 主题发起人 Another_eYes
  • 开始时间 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
当你调用procedure aaa(const s: string);后发觉传入的s被清空了你会不会觉得很神奇呢?
其实很简单:
procedure aaa(const s: string);
var
ss: string;
n: Integer;
begin
n := Integer(s);
ss := string(n);
if PInteger(n-8)^>0 then
Dec(PInteger(n-8)^);
end;

调用:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s:=StringOfChar('a', 100);
ShowMessage(s);
aaa(s);
ShowMessage(s);
end;

调用aaa(s)后s就被清空了。
原理: 非常简单, 只不过手工改变了字符串引用计数而已。
 
你把它的引用计数设置为0了! Delphi把字符串释放掉吧.
假如测试代码 s:='CONST_STR';
你这个没有效果了吧.
我改了一下, 同时把长度也改了.
procedure aaa2(const s: string);
var
n: Integer;
begin
n := Integer(s);
if PInteger(n - 4)^ > 0 then
PInteger(n - 4)^ := 0;
PInteger(n-4)^ := -1;
end;
 
后退
顶部