我经常读到,编译器在强制转换为PChar
时具有某种魔力。PChar
的主要目的是在需要零终止字符数组(C样式“字符串”)的库中调用外部代码。PChar
是一种类型,在Unicode Delphi上是PWideChar
的别名,在非Unicode Delphi上是PAnsiChar
的别名。
另一方面,Delphi字符串(string
= AnsiString
/ UnicodeString
,在这里我不是在谈论WideString
,更不用说ShortString
...了)具有隐藏的长度而不是终止字符。它们也被引用计数,并在写入时使用副本。
是否自动分配了Delphi字符串并使用隐式#0字符将其保留为一个字符以上,以便更容易地转换为PChar
(PAnsiChar / PWideChar),或者在遇到转换为?
最佳答案
流程如下:
如果字符串s
的长度大于零,则PChar(s)
返回一个指向字符串内容的第一个元素的指针。因为string
被管理为具有隐藏的空终止符,所以无需执行其他操作。
如果字符串s
的长度为零,则PChar(s)
返回一个指向包含空终止符的内存块的指针。
作为实现细节,从PChar(nil)
返回的空终止符是在已编译模块的只读部分中分配的全局常量。
Delphi字符串是否自动分配并保持为1个字符,并带有隐式#0字符,以便更容易地转换为PChar(PAnsiChar / PWideChar)?
是。
如果可以这样称呼,那就是:
在空字符串上使用PChar()
将返回一个指向空终止符的指针。
Delphi在字符串的末尾保留了隐藏的空终止符。
关于string - PChar/PWideChar/PAnsiChar强制转换中是否存在任何编译器魔术?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14980880/