我在处理StrPCopy()时遇到一个奇怪的问题。请查看以下示例代码:

procedure TForm2.butnTestClick(Sender: TObject);
var
  s : string;
begin
  //-- assign string this way will cause AV when trying to StrPCopy()
  s := 'original string';

  //-- assign string this way works!!!!!!!
  //s := Trim('original string');

  //-- AV error when trying to alter the string
  StrPCopy(PChar(s), PChar('changed'));

  //-- should come back with "changed"
  Memo1.Lines.Add(s);
end;


我正在使用Delphi 10 Seattle。如果尝试使用StrPCopy()更改“ s”,则会出现AV错误。但是,我用Trim()包围了字符串声明,它将起作用。

好像用Trim()将字符串声明括起来一样,会触发编译器关闭对该特定字符串的某种排序优化。我只是不知道那是什么。请帮忙。

最佳答案

您使用StrPCopy()调用并不安全-不管使用通过Trim()分配创建的新字符串消除了AV还是什么。

字符串数据类型比PChar更复杂。它具有一个长度分量,神奇地位于指针和字符数据的前面。强制转换为PChar可以,但是只能用于阅读。

通过将字符串强制转换为PChar,可以让StrPCopy将“更改的”字符串放入内存的该部分。在您的示例中,您正在复制一个较小的字符串,因此您可以明智地使用内存。结果是一个非常混乱的字符串(长度与字符串不匹配,中间有一个空字符),但是您在它的范围之内。

如果您的代码是类似...

StrPCopy(PChar(s), PChar('changed to this string'));


...然后您的代码将覆盖字符串的内存占用量以上-通常没有立即的AV。您可能会摆脱这个。你不可以。

10-04 18:41