delphi 里怎么用指针直接修改字符串 ( 积分: 30 )

  • 主题发起人 主题发起人 2111111
  • 开始时间 开始时间
2

2111111

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:
var
str:string;
p:pchar;
begin
str:='i can do t!';
//希望将所有的i改成k
p:=pointer(str);
p^:='k';
//这样改为什么会出错呢?
end;
 
比如:
var
str:string;
p:pchar;
begin
str:='i can do t!';
//希望将所有的i改成k
p:=pointer(str);
p^:='k';
//这样改为什么会出错呢?
end;
 
p:=pointer(str);

str[1] := 'k'
// 可以运行
// lea eax, [ebp-$04]
// call @UniqueStringA
// mov byte ptr [eax], $6b

p[0]:= 'k'
// 不可以运行, 同 p^ := 'k';
// mov eax, [ebp-$08]
// mov byte ptr [eax], $6b

如果用str[1]来赋值的时候会调用UniqueString函数,实现string对象的CopyOnWrite技术。
应该是在内存管理的时候对string有特殊的处理,如果不调用UniqueString函数而直接对string的内存空间写值就会出错了。

个人猜测,没有见过正规的资料上说这个问题。
 
你不需要用到指针的,只需要用delphi自己的函数就可以:
stringreplace( str, 'i', 'k', rfReplaceAll);
 
str:='i can do t!';
问题原因在于str指向一个常量字符串,不可写。
var
str: string;
p: PChar;
begin
str := 'i ';
str := str + 'can do t!';
p := Pointer(str);
p^ := 'k';
ShowMessage(str);
end;
 
应该是delphi的一个bug吧,优化的结果
按正规说法只有在用const定义的时候才不能改变
 
后退
顶部