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

9.3 Dynamische Felder

9.3 Dynamische Felder

Mit den bisherigen Mitteln war es nur möglich, zur Entwicklungszeit die Größe von Feldern statisch festzusetzen. Nun möchte ich Ihnen zeigen, wie ein solcher Datentyp dynamisch, zur Laufzeit verwaltet werden kann. Dynamische Felder lassen sich nicht in normalen Variablen speichern. Hierfür benötigt man Zeiger auf einen beliebigen Datentyp, nur dass man noch eine Anzahl mit angibt. Intern werden dann entsprechende Variablen im Speicher, unmittelbar nebeneinander, reserviert. Das Anlegen eines Zeigers auf einen Integer, unterscheidet sich also nicht von einem dynamischen Array mit einem einzigen Integer.

Zum Seitenanfang
Zum Inhaltsverzeichnis

9.3.2 Die Funktion realloc()

9.3.2 Die Funktion realloc()

Mit dieser Funktion ist es möglich, den Speicherbedarf einer Variable oder besser gesagt den Bereich, worauf ein Pointer zeigt, zu verändern. Dabei wird aber im seltensten Fall der Bereich einfach größer gemacht. Meistens wird ein ganz neuer Bereich im RAM reserviert, der alte Inhalt dorthin verschoben und der alte Bereich freigegeben. Das scheint wie eben bereits erwähnt, ziemlich Zeitaufwendig zu sein, aber ganz so schlimm ist dies auch nicht, da intern viel bessere Mechanismen benutzt werden, als ,am das von Hand hinbekommen würde.

Das Schema sieht so aus:
<Zeigervariable> = (<VariablenTypeDesZeigers>)realloc(<Zeigervariable>, <Größe>)

Im folgenden Beispiel sehen Sie, wie ich zunächst ein Array anlege und mich später dafür entscheide, es doch größer haben zu wollen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
					
// Ein Array mit Platz für drei Integer
int* pArray	= (int*)malloc(3 * sizeof(int));
pArray[0]	= 10;
pArray[1]	= 20;
pArray[2]	= 30;

// Array vergrößern, da noch ein vierter Integer rein muss
pArray		= (int*)realloc(pArray, 4 * sizeof(int));
pArray[3]	= 40;

printf("%i %i %i %i\n", pArray[0], pArray[1], pArray[2], pArray[3]);

free(pArray);
					

Ausgabe:

4
8.7
		
Zum Seitenanfang
Zum Inhaltsverzeichnis

9.3.1 Unveränderliche dynamische Felder

9.3.1 Unveränderliche dynamische Felder

Als erstes möchte ich Ihnen zeigen, wie man schnell und einfach dynamische Arrays mit "new" anlegt, mit ihnen arbeitet und anschließend mit "delete" wieder freigibt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
					
int iAnzahl;

printf("Bitte geben Sie an, wie viele Floats im Array sein sollen: ");
scanf("%i", &iAnzahl);
printf("\n");

// Wenn ein ungültiger Bereich angegeben wurde
if (iAnzahl < 1) {
	iAnzahl			= 1;
} // end of if

// Pointer auf ein dynamisches Array mit Floats anlegen
float* pArrayOfFloats		= new float[iAnzahl];

// Durchlaufe die Elemente im Array
for (int iCount=0; iCount<iAnzahl; iCount++) {
	float fEingabe;

	printf("Bitte ein float eingeben: ");
	scanf("%f", &fEingabe);

	pArrayOfFloats[iCount]	= fEingabe;
} // end of for

printf("\n");

// Durchlaufe die Elemente im Array
for (int iCount=0; iCount<iAnzahl; iCount++) {
	printf("[%i] = %g\n", iCount, pArrayOfFloats[iCount]);
} // end of for

// Reservierten Speicher wieder freigeben
delete [] pArrayOfFloats;
					

Ausgabe:

Bitte geben Sie an, wie viele Floats im Array sein sollen: 3

Bitte ein float eingeben: 1.2
Bitte ein float eingeben: 2.3
Bitte ein float eingeben: 3.4

[0] = 1.2
[1] = 2.3
[2] = 3.4
		

Allerdings ergibt sich jetzt hier bereits eines der erwähnten Nachteile von "new" und "delete". Man kann im Nachhinein keine weiteren Elemente hinzufügen bzw. entfernen. Um dies zu realisieren, müsste man den Inhalt des gesamten Feldes irgendwo zwischenspeichern, dass original mit "delete" freigeben und mit "new" und einer neuen Größenangabe neu anlegen. Dieser Mechanismus ist nicht nur umständlich, sondern auch Zeitaufwändig.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012