Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Änderung eines Strings / Zeiger darauf (https://www.delphipraxis.net/182118-aenderung-eines-strings-zeiger-darauf.html)

Gargamel 2. Okt 2014 08:46

Änderung eines Strings / Zeiger darauf
 
Hallo

Ein String ist doch ein Array of Char. Wenn nun der Inhalt des Strings geändert wird, müsste doch eigentlich für das neue Array auch neuer Speicherplatz angefordert werden, damit der neue Inhalt da reinpasst. Und der alte Speicherplatz wird wieder entfernt. Was ist, wenn man einen Zeiger hat, der auf das alte Array zeigte? Denn eigentlich müsste dieser Zeiger auf einen ungültigen Speicherbereich zeigen.

Wie wird das intern geregelt?

Danke

Uwe Raabe 2. Okt 2014 08:51

AW: Änderung eines Strings / Zeiger darauf
 
http://docwiki.embarcadero.com/RADSt...e_String-Typen


Zitat:

Eine String-Variable vom Typ UnicodeString oder AnsiString belegt auf 32-Bit-Plattformen 4 Byte (und unter 64-Bit 8 Byte) im Arbeitsspeicher, die einen Zeiger auf einen dynamisch zugewiesenen String enthalten.

Gargamel 2. Okt 2014 09:01

AW: Änderung eines Strings / Zeiger darauf
 
Wenn eine String-Variable intern einen Zeiger auf den dynamisch zugewiesenen String enthält und ich einen Zeiger auf die String-Variable zeigen lasse, zeigt sozusagen ein Zeiger auf einen anderen Zeiger. Und damit auf einen gültigen Speicherbereich.

Richtig?

himitsu 2. Okt 2014 09:28

AW: Änderung eines Strings / Zeiger darauf
 
Kommt drauf an wie lange dein Zeiger lebt, denn selbst wenn der String durch andere Referenzen weiter lebt, dann kann die Variable, auf welche dein Zeiger zeigt, schon lange weg sein.
Und nein, der String-Speicher verschiebt sich nicht sofort immer ... Es kommt drauf an was geändert wird und wie, ob FastMM den Speicher InPlace vergrößern/verkleinern kann und ob es noch weitere Referenzen auf den String gibt.

Ja, wenn das verschoben wurde, dann zeigt dein Zeiger ins nichts, oder vermutlich eher auf was "Anderes"
und behandelt wird sowas natürlich nicht, denn keiner, außer du, weiß von der Referenz dem Zeiger, also mußt du das auch selber abfangen.

Uwe Raabe 2. Okt 2014 09:54

AW: Änderung eines Strings / Zeiger darauf
 
Zitat:

Zitat von Gargamel (Beitrag 1274531)
Wenn eine String-Variable intern einen Zeiger auf den dynamisch zugewiesenen String enthält und ich einen Zeiger auf die String-Variable zeigen lasse, zeigt sozusagen ein Zeiger auf einen anderen Zeiger. Und damit auf einen gültigen Speicherbereich.

Richtig?

Richtig! Wenn dein Zeiger auf die String-Variable zeigt, dann ist das ein Zeiger auf einen Zeiger. Ändert sich der Zeiger in der String-Variablen, dann kann das deinem Zeiger auf die Variable ja egal sein. Du musst nur aufpassen, daß die String-Variable mindestens solange lebt, wie du deinen Zeiger darauf verwendest - aber das sollte ja offensichtlich sein.

Gargamel 2. Okt 2014 10:50

AW: Änderung eines Strings / Zeiger darauf
 
Vielen Dank. Das hilft mir weiter.

Bei der Gelegenheit: Ich wusste nicht, daß Unicode-Strings 4 Byte (8 Byte bei 64bit) haben. Ich dachte gelesen zu haben, daß Unicode-Char's 2 Byte besitzen. Aber das war eine Info zu C# und dem .net Framework.
Ich nahm an, das das bei allen Sprachen identisch ist.

mkinzler 2. Okt 2014 11:07

AW: Änderung eines Strings / Zeiger darauf
 
Es gibt verschiedene Unicodetypen:
-UTF-8( UCS): variablel; die 1. 127 Bit sind ASCII und zu ANSI kompatibel 1-4: Linux, alte Unicodeimplementierungen in Delphi (WideString)
-UTF-16: variable
-UCS2: 2 Zeichen fest, Standardformat von Windows -> Delphi UnicodeString
-UCS4: 4 Zeichen fest

Uwe Raabe 2. Okt 2014 11:14

AW: Änderung eines Strings / Zeiger darauf
 
Zitat:

Zitat von Gargamel (Beitrag 1274576)
Bei der Gelegenheit: Ich wusste nicht, daß Unicode-Strings 4 Byte (8 Byte bei 64bit) haben.

Das sind die Größen der entsprechenden Zeiger!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

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