我经常读到,编译器在强制转换为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/

10-11 14:24