Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

10.1.2 Dynamische Strings

10.1.2 Dynamische Strings

Da Strings ja, wie bereits erwähnt, nur Felder sind, kann man auch sie dynamisch erzeugen und verwalten.

Das Schema sieht so aus:
char* <Variable> [= "<Zeichenkette>"]|[= new char[<AnzahlDerZeichen>]]

 1
 2
 3
 4
 5
					
char* pcstrZeigerAufKonstante	= "Ich bin ein Zeiger auf eine statische Konstante.";
printf("%s\n", pcstrZeigerAufKonstante);

pcstrZeigerAufKonstante		= "Jetzt zeige ich auf eine andere Konstante.";
printf("%s\n", pcstrZeigerAufKonstante);
					

Ausgabe:

Ich bin ein Zeiger auf eine statische Konstante.
Jetzt zeige ich auf eine andere Konstante.
		

Obwohl ich in Zeile 1 einen Pointer deklariert haben, darf dieser in diesem Spezialfall nicht freigegeben werden! Der Grund dafür ist folgender. Intern legt der Compiler eine Konstante an und die Referenz auf diese Konstante wird an den Pointer übergeben. Versuchen man jetzt, den Speicher freizugeben, wird dies zu einer Schutzverletzung führen, da man mit Konstanten nichts machen darf.

Genauso dürfen Sie jetzt nicht den Inhalt der Zeichenkette ändern, weder per Funktion noch per Indexzugriff. Das einzige was Sie machen dürfen ist, wie in Zeile 4 gezeigt, den Zeiger auf eine andere Konstante zeigen lassen. Dabei sei erwähnt, dass dabei kein Speicher verloren geht, weil sich der Compiler um die Speicherverwaltung von Konstanten kümmert. Das war auch der Grund, warum ich hier keine Größe für den String angeben musste.

 1
 2
 3
 4
 5
 6
 7
 8
					
char* pstrZeigerAufDynamischenString	= new char[80];

strcpy_s(pstrZeigerAufDynamischenString, 80, "Ich bin ein dynamischer String.");
printf("%s\n", pstrZeigerAufDynamischenString);

pstrZeigerAufDynamischenString[30]	= '!';
printf("%s\n", pstrZeigerAufDynamischenString);
delete [] pstrZeigerAufDynamischenString;
					

Ausgabe:

Ich bin ein dynamischer String.
Ich bin ein dynamischer String!
		

In diesem Beispiel zeige ich, wie man selbst die Speicherverwaltung für Strings übernimmt und genau das, sehen Sie in Zeile 1 und 8. Jetzt muss man allerdings aufpassen, dass man erstens genug Speicher reserviert und man darf unter keinen Umständen, dem String eine Referenz auf eine Konstante zuweisen, wie ich das im Vorherigen Beispiel getan habe. Der Grund dafür liegt auf der Hand. Mit dem Zuweisen einer neuen Referenz, verliert man den Bezug zum vorher reservierten Speicher und somit kann jener nicht mehr freigegeben werden (Speicherleck).

Jetzt darf man aber wieder Stringfunktionen benutzen und man kann auch wieder den Inhalt über den Indexzugriff manipulieren. Dies zeige ich in Zeile 3 und 6.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012