Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 6. Jan 2003, 18:06
Moin d3g,

Der Typ string ist, standardmässig ein Longstring, der
  • vor dem eigentlichen Stringinhalt noch ein vier Byte langes Längenfeld und
  • vor diesem Längenfeld ein vier Byte langes Feld als Referenzzähler enthält.

Diese beiden Felder hat ein PChar nicht.

Ein string ist ein dynamisches Array, was ein PChar auch nicht ist.

BTW: Ein string wird nur deshalb intern nullterminiert, damit man keine Probleme mit dem Aufruf von C Funktionen, wie z.B. denen der Windows API bekommt. Selbst für Assembler ist ein Längefeld praktischer

Stellt man auf Shortstring um (dadurch verändert sich automatisch die Bedeutung des Schlüsselwortes string!), so ist die erste Stelle des strings (string[0]!) ein Längenfeld, erst dann folgt der Inhalt.
Ausserdem ist ein Shortstring nicht nullterminiert.

Wie ich in meinem letzten Beispiel glaubte demonstriert zu haben ( )könnte man sich die Funktionen der Windows API so importieren, dass man einen string als PChar verwenden kann, aber:
Das setzt voraus, dass man nicht auf ShortString umstellt.

Die Art wie Borland die Deklaration der Parametertypen beim Import der Windows API Funktionen durchgeführt hat, ist auch der Grund dafür, dass Delphi stur auf einem Typecast besteht. Für den Compiler ist string kein Pointer, und kann somit nicht als Pointer übergeben werden.

Wie gesagt: Es hindert Dich niemand daran, dieses Problem durch eigenen Import der Funktionen, und entsprechender Vergabe der Parametertypen zu umgehen, aber dann wärest Du auch dafür verantwortlich, dass das nicht zu problemen führt, und, falls das für Dich interessant ist. Jeder andere wird wohl erstmal Probleme bekommen Deine Sourcen zu lesen.
Ich weiss auch zugegebener Massen nicht (ich hab's halt noch nicht ausprobiert), was passiert, wenn Du an so einer Stelle dann mal ein Stringliteral übergibst.

Im Prinzip könnte der Compiler das natürlich auch verwalten, denn er muss ja zu jedem Zeitpunkt "wissen" welcher Datentyp sich nun exakt hinter string verbirgt, aber dies ist nicht so implementiert, dass das vorher beschriebene problemlos funktioniert.

Der Witz am Typ string ist übrigens, dass er aufgrund des Längenbytes nicht die Bufferoverflow Probleme kennt, wie man es ja immer wieder so schön bei den Sicherheitsproblemen diverser Software lesen kann, und, dass er, aufgrund des Referenzzählers eine andere (bessere !?) Verwaltung des erforderlichen Speichers ermöglicht.
Wie schon erwähnt, hat der Längenzähler noch den Vorteil, dass die Stringfunktionen der Intel CPUs mit einem Zähler arbeiten, man also nicht mühsam auf eine Null testen muss, sondern direkt das Längenfeld verwenden kann.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat