我有一个非常愚蠢的问题...... 为什么这段代码:
PChar('x');
导致"访问违规"错误? 编译器优化?
示例:
var s: String;
...
s := StrPas(PAnsiChar('x'));
这导致Delphi 5 / Delphi XE中的AV
或者这个:
Windows.MessageBox(0, PChar('x'), PChar('y'), 0);
这导致Delphi 5中的AV,但在Delphi XE中没有 在XE中有一个空的MessageBox
控制台示例:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var s: String;
begin
s := StrPas(PChar('xxx')); // EAccessViolation here
end.
答案 0 :(得分:3)
StrPas(PAnsiChar('x'));
我认为'x'
被视为字符文字而不是字符串文字。所以演员阵容无效。如果是这样,那么这将按照您的预期工作
StrPas('x');
由于隐式转换。或
StrPas(PAnsiChar(AnsiString('x')));
感谢显式转换。
我认为前者可能是首选。文字不需要转换为null终止指针类型。编译器可以发出正确的代码而无需强制转换。演员总是冒着压制错误的风险。