将文字投射到PChar / PAnsiChar

时间:2015-02-12 06:29:23

标签: delphi access-violation c-strings

我有一个非常愚蠢的问题...... 为什么这段代码:

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.

1 个答案:

答案 0 :(得分:3)

StrPas(PAnsiChar('x'));

我认为'x'被视为字符文字而不是字符串文字。所以演员阵容无效。如果是这样,那么这将按照您的预期工作

StrPas('x');

由于隐式转换。或

StrPas(PAnsiChar(AnsiString('x')));

感谢显式转换。

我认为前者可能是首选。文字不需要转换为null终止指针类型。编译器可以发出正确的代码而无需强制转换。演员总是冒着压制错误的风险。