我有个很蠢的问题..。为什么这个代码:
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,而在XE中的Delphi中不会出现空的MessageBox。
控制台示例:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var s: String;
begin
s := StrPas(PChar('xxx')); // EAccessViolation here
end.发布于 2015-02-12 07:17:01
StrPas(PAnsiChar('x'));我假定'x'被视为字符文本而不是字符串文本。所以这个演员是无效的。如果是这样的话,这将如您所期望的那样起作用。
StrPas('x');由于隐式转换。或
StrPas(PAnsiChar(AnsiString('x')));多亏了显式的转换。
我认为前者可能是首选。文字不需要转换为空结束的指针类型。编译器可以在没有强制转换的情况下发出正确的代码。而强制转换总是冒着抑制错误的风险。
https://stackoverflow.com/questions/28470810
复制相似问题