gpt4 book ai didi

delphi - 奇怪的StrPCopy()AV错误和变通办法似乎没有意义

转载 作者:行者123 更新时间:2023-12-03 19:24:53 25 4
gpt4 key购买 nike

我在处理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。您可能会摆脱这个。你不可以。

关于delphi - 奇怪的StrPCopy()AV错误和变通办法似乎没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48234401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com