Ist PChar ('') garantiert ein Zeiger auf # 0 (nicht nil)?

8

Ich verstehe, dass in Delphi eine leere Zeichenfolge (AnsiString oder WideString) durch einen Nullzeiger oder durch einen Zeiger auf eine tatsächliche leere Zeichenfolge dargestellt werden kann.

Per Experiment habe ich in Delphi XE2 (mit bestimmten Compilereinstellungen) PChar('') <> nil gezeigt. Aber ist das garantiert oder wird es sich in einer zukünftigen Version ändern oder von einer Compiler-Einstellung abhängig sein?

Ich habe eine Vertrauenskrise. Wenn mir jemand eine definitive Antwort geben kann, wäre ich dankbar.

    
Ian Goldby 12.02.2013, 15:45
quelle

1 Antwort

10

Ja. Typumwandlungen von Zeichenfolgenliteralen nach PChar sind niemals Nullzeiger. Typumwandlungen von Strings des gleichen Zeichentyps nach PChar sind ebenfalls nicht null. (String zu PChar, AnsiString zu PAnsiChar, etc.)

Typumwandlungen anderer Dinge in PChar können jedoch null sein. (Zeiger auf PChar, AnsiString zu PWideChar, etc.)

Die Dokumentation behandelt dies im Abschnitt Mischen von Delphi-Strings und nullterminierten Strings im Abschnitt String Types Thema:

  

Sie können auch eine UnicodeString- oder AnsiString-Zeichenfolge als a   Null-terminierte Zeichenfolge. Die folgenden Regeln gelten:

     
  • Wenn S eine UnicodeString-Zeichenfolge ist, gibt PChar (S) S als nullterminierte Zeichenfolge aus. Es gibt einen Zeiger auf das erste Zeichen in S zurück   werden für die Windows-API verwendet. Zum Beispiel, wenn Str1 und Str2 sind   UnicodeString, könnten Sie die Win32 API MessageBox Funktion wie aufrufen   dies: MessageBox (0, PChar (Str1), PChar (Str2), MB_OK) ;. Benutzen   PAnsiChar (S) wenn S ein AnsiString ist.
  •   
  • Sie können Pointer (S) auch verwenden, um eine Zeichenfolge an einen nicht typisierten Zeiger zu übergeben. Wenn S leer ist, gibt die Typumwandlung nil zurück.
  •   
  • PChar (S) gibt immer einen Zeiger auf einen Speicherblock zurück; Wenn S leer ist, wird ein Zeiger auf # 0 zurückgegeben.
  •   
  • Wenn Sie eine UnicodeString- oder AnsiString-Variable in einen Zeiger umwandeln, bleibt der Zeiger gültig, bis der Variable ein neuer Wert zugewiesen wird   oder geht außer Reichweite. Wenn Sie einen anderen Zeichenfolgenausdruck in a umwandeln   Zeiger, der Zeiger ist nur gültig innerhalb der Anweisung, wo der   Typumwandlung wird durchgeführt.
  •   
  • Wenn Sie einen UnicodeString- oder AnsiString-Ausdruck in einen Zeiger umwandeln, sollte der Zeiger normalerweise als schreibgeschützt betrachtet werden. Sie können   Verwenden Sie den Zeiger sicher, um die Zeichenfolge nur zu ändern, wenn alle   Folgende Bedingungen sind erfüllt:      
    • Der Ausdruck cast ist eine UnicodeString- oder AnsiString-Variable.
    •   
    • Die Zeichenfolge ist nicht leer.
    •   
    • Die Zeichenfolge ist eindeutig - das heißt, sie hat eine Referenzzahl von eins. Um sicherzustellen, dass die Zeichenfolge eindeutig ist, rufen Sie SetLength, SetString oder auf   UniqueString-Prozeduren.
    •   
    • Die Zeichenfolge wurde seit der Typumwandlung nicht geändert.
    •   
    • Die geänderten Zeichen befinden sich alle innerhalb der Zeichenfolge. Achten Sie darauf, keinen Index außerhalb des Bereichs für den Zeiger zu verwenden.
    •   
  •   

Beim Mischen von WideString-Werten mit PWideChar gelten die gleichen Regeln   Werte.

    
Rob Kennedy 12.02.2013, 15:51
quelle