PChar('')是否保证是指向#0(不是nil)的指针?

时间:2013-02-12 15:45:03

标签: delphi null string null-terminated pchar

据我所知,在Delphi中,空字符串(AnsiString或WideString)可以用nil指针表示,也可以用指向实际空字符串的指针表示。

通过实验我已经在Delphi XE2(具有特定的编译器设置)中显示PChar('') <> nil。但这是保证的,还是可能在将来的版本中更改,或者依赖于某些编译器设置?

我有信心危机。如果有人能给我一个明确的答案,我将不胜感激。

1 个答案:

答案 0 :(得分:10)

是。从字符串文字到PChar的类型转换永远不会是空指针。从具有相同字符类型的字符串到PChar的类型转换也不会为空。 (字符串到PChar,AnsiString到PAnsiChar等)

其他东西到PChar的类型转换可能是null。 (指向PChar的指针,指向PWideChar的AnsiString等)

文档在字符串类型主题的Mixing Delphi Strings and Null-Terminated Strings部分介绍了这一点:

  

您还可以将UnicodeString或AnsiString字符串转换为   以null结尾的字符串。以下规则适用:

     
      
  • 如果S是UnicodeString,则PChar(S)将S转换为以null结尾的字符串;它返回一个指向S中第一个字符的指针   用于Windows API。例如,如果Str1和Str2是   UnicodeString,你可以调用Win32 API MessageBox函数   this:MessageBox(0,PChar(Str1),PChar(Str2),MB_OK);.使用   如果S是AnsiString,则为PAnsiChar(S)。
  •   
  • 您还可以使用Pointer(S)将字符串转换为无类型指针。但如果S为空,则类型转换返回nil。
  •   
  • PChar(S)总是返回一个指向内存块的指针;如果S为空,则返回指向#0的指针。
  •   
  • 当您将UnicodeString或AnsiString变量强制转换为指针时,指针将保持有效,直到为变量分配新值为止   或超出范围。如果将任何其他字符串表达式转换为a   指针,指针只在语句中有效   执行类型转换。
  •   
  • 将UnicodeString或AnsiString表达式强制转换为指针时,通常应将指针视为只读。您可以   安全地使用指针只在所有的时候修改字符串   满足以下条件:      
        
    • 表达式cast是UnicodeString或AnsiString变量。
    •   
    • 字符串不为空。
    •   
    • 字符串是唯一的 - 即引用计数为1。要保证字符串是唯一的,请调用SetLength,SetString或   UniqueString程序。
    •   
    • 自进行类型转换以来,字符串未被修改。
    •   
    • 修改的字符都在字符串中。注意不要在指针上使用超出范围的索引。
    •   
  •   
     

将WideString值与PWideChar混合时,适用相同的规则   值。