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.2.2 Die Funktionen malloc(), calloc() und free()

9.2.2 Die Funktionen malloc(), calloc() und free()

Wenn man Zeiger auf Werte erstellen möchte, ohne dass man vorher eine normale Variable definiert hat und dann auf jene verweist, muss man sich zunächst Speicher im RAM reservieren und zum Ende wieder freigeben. Allerdings ist diese eigenständige und dynamische Speicherverwaltung etwas Trickreich und man muss gut aufpassen, dass man alles wieder freigibt, was man reserviert hat, da sonst entsprechender Speicher nicht mehr benutzt werden kann, solange das Programm läuft. Wenn das Programm schließlich beendet wird, sorgt der s.g. Garbage Collector dafür, dass auch noch der Rest freigegeben wird, welchen man vergessen hat. An dieser Stelle sei aber erwähnt, dass dies erst seit Windows 2000 so ist. Dies ist u.a. ein Grund dafür, warum Windows 98 nie länger als 78 Stunden am Stück lief, da es irgendwelche Programme gab, die s.g. Speicherlecks verursachten. Irgendwann war der Speicher voll und der PC somit handlungsunfähig (andere Faktoren spielten allerdings auch eine Rolle).

Mit "malloc" kann man sich Speicher reservieren, wobei man angeben muss, wie viel Speicher man haben möchte. Zudem muss ggf. das Ergebnis von "malloc" gecastet werden, da manche Compiler oben erklärten "void" Pointer zurückgeben. Falls beim Reservieren des Speichers etwas schief läuft, gibt die Funktion "NULL" zurück.

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

 1
 2
 3
 4
 5
 6
 9
10
11
12
13
14
15
16
					
// Zeiger auf einen float vorbereiten
float* pZeigerAufFloat;

// Speicher für eine Float-Variable reservieren
pZeigerAufFloat	= (float*)malloc(sizeof(float));

// Wenn das Reservieren des Speichers funktioniert hat (ganz paranoid)
if (pZeigerAufFloat != NULL) {
	// Reservierung hat funktioniert
} else {
	// Reservierung ist fehlgeschlagen, weil z.B. der RAM voll ist
} // end of if

// ...
					

Alternativ zur Funktion "malloc" kann man auch "calloc" benutzen, wobei sich ein paar kleine Vorteile ergeben. Die Funktion calloc benötigt zwar eine zusätzliche Variable, welche die Anzahl der zu reservierenden Elemente angibt, aber (gerade bei Arrays interessant) zudem werden alle Elemente mit dem Wert 0 initialisiert.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
					
// Zeiger auf einen float vorbereiten
float* pZeigerAufFloat;

// Speicher für eine Float-Variable reservieren
pZeigerAufFloat	= (float*)calloc(1, sizeof(float));

// Wenn das Reservieren des Speichers funktioniert hat (ganz paranoid)
if (pZeigerAufFloat != NULL) {
	// Reservierung hat funktioniert
	// der Wert, worauf pZeigerAufFloat zeigt, ist 0
} else {
	// Reservierung ist fehlgeschlagen, weil z.B. der RAM voll ist
} // end of if

// ...
					

Wie bereits erwähnt, muss man reservierten Speicher auf wieder freigeben und dafür gibt es die Funktion "free". Sie übergeben einfach den Zeiger des Elementes, dessen Speicher gelöscht werden soll.

Das Schema sieht so aus: free(<Zeigervariable>)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
					
// Zeiger auf einen float vorbereiten
float* pZeigerAufFloat;

// Speicher für eine Float-Variable reservieren
pZeigerAufFloat	= (float*)calloc(1, sizeof(float));

// Nur wenn der Speicher auch reserviert wurde
if (pZeigerAufFloat != NULL) {
	free(pZeigerAufFloat)
} // end of if
					
Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012