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
)
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}
...