AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Änderung eines Strings / Zeiger darauf

Ein Thema von Gargamel · begonnen am 2. Okt 2014 · letzter Beitrag vom 2. Okt 2014
Antwort Antwort
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#1

Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 09:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 09:51
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#3

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 10:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 10:28
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.
$2B or not $2B

Geändert von himitsu ( 2. Okt 2014 um 10:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 10:54
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#6

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 11:50
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 12:07
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: Änderung eines Strings / Zeiger darauf

  Alt 2. Okt 2014, 12:14
Bei der Gelegenheit: Ich wusste nicht, daß Unicode-Strings 4 Byte (8 Byte bei 64bit) haben.
Das sind die Größen der entsprechenden Zeiger!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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