Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer to String; String to Pointer (https://www.delphipraxis.net/133299-pointer-string%3B-string-pointer.html)

himitsu 29. Apr 2009 15:45

Re: Pointer to String; String to Pointer
 
das UniqueString wird nur aufgerufen, damit der String einmalig ist (also Referenzzähler = 1), wenn man eventuell mal schreibend auf den String zugreift (wann man da nur lesen will und dazu keine "zeitgraubenden" Sicherungsmaßnahmen seitens Delphi haben will, dann muß man da schon etwas rumtricksen :nerd: )

Aber der Grund, warum dort eine Exception auftritt ist:
der Zeiger auf die Stringdaten wird sozusagen erst derefferenziert und dann um den Index zum Zeichen erhöht.
Da ein Leerstring intern nunmal NIL ist, man NIL so schlecht dereferenzieren kann ... *peng*

PS: wenn man bei einem 2 Zeichen langem String auf S[3] zugreift, dann schlägt dort maximal die Bereichsprüfung zu, wenn diese mit einkompiliert wurde.


Delphi-Quellcode:
P := PChar(S); // P := LStrToPChar(S_var);

P := @S[3];    // UniqueString(S_var);         // oder in Kurz:
                // P := @(Pointer(S_var) + 2)^; // P := @(Pointer(UniqueString(S_var)) + 2)^;
und hier der Grund, warum es kein NIL Problem gibt ... sind keine Stringdaten vorhanden, dann wird bei PChar(S) auf einen existierenden Speicher verwiesen, wo nur #0 drinsteht
Delphi-Quellcode:
function _LStrToPChar(const s: AnsiString): PChar;
{$IFDEF PUREPASCAL}
const
  EmptyString = '';
begin
  if Pointer(s) = nil then
    Result := EmptyString
  else
    Result := Pointer(s);
end;
{$ELSE}
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz