Teil 10 : Die dynamischen Felder in C |
Speicheranforderung |
Nehmen wir an, wir benötigen ein Feld mit einer veränderlichen Größe. Was wir nun benötigen ist eine Anzahl der Elemente, die wir anfordern und die Größe der Einzelelemente, damit wir dem Rechner mitteilen können, wieviel Speicher wir für unsere Zwecke benutzen wollen.
Die Speicheranforderung erfolg mittels
Variablentyp *feld;
: feld = malloc (Anzahl * sizeof ( Variablentyp )); |
Es wird ein Feld angefordert, welches aus Daten des Typs Variablentyp
besteht. Es kann hier z.B. eine Struktur als Element angefordert werden.
Von der Funktion malloc wird ein Zeiger auf das erste Feldelement
zurückgegeben.
Als Rückgabewert erhalten wir einen Zeiger auf das erste Element
des so initialsierten Feldes.
Dumm ist es, wenn man mehr Speicher anfordert als zur Verfügung
steht. Da man als Programmierer nicht alles wissen kann lassen wir uns
natürlich auch gleich anzeigen, wenn die Speicheranforderung fehlschlug.
Wird als Rückgabewert NULL geliefert, ist etwas schiefgelaufen.
Dies sollte man immer bei der Speicheranforderung abfragen!
Als Argument für malloc ist der Speicher in Bytes anzugeben, welcher
angefordert wird. Nun kann man von faulen, ok - effizient ist ein besseres
Wort :) , Programmierern nicht verlangen die Bytes abzuzählen, die
ein Element beansprucht.
Dafür gibt es eine tolle Funktion namens sizeof die das
für uns erledigt.
int bytes;
: bytes = sizeof ( Variablentyp ); |
Im Beispiel ist der Variablentyp durch den Elemtentyp, z.B. double oder
auch durch eine Struktur zu ersetzen. Als Rückgabe erhält man
die Anzahl, die der Variablentyp belegt als Integer.
Wenn man nun diesen Wert mit der Elementenanzahl multipliziert, erhalten
wir den Speicher in Bytes, die unser Feld beansprucht.
:
int bytes; int Feldgroesze = 5; /*
mit 5 double-Elementen benötigt bytes = Feldgroesze * sizeof ( double );
|
Speicherfreigabe |
Was macht man mit Dingen, die man nicht mehr benötig ? Man entsorgt
sie.
Wenn man nun ein Feld wieder freigeben möchte, so sagt man ihm
einfach mittels
Variablentyp *feld;
: free ( feld ); |
Das er den Speicher auf den der übergebene Zeiger zeigt wieder
freigegeben wird.
In einem Programm müßte also folgendes einfügen um
Speicher zu belegen und wieder freizugeben.
Variablentyp *feld;
: /* Speicheranforderung */ feld = malloc (Anzahl * sizeof ( Variablentyp )); : /* Speicherfreigabe */ free (feld); : |
Um das Ganze zu vervolständigen, müssen wir nun noch im Header
eine Include-Datei einfügen, welche die benötigten Vereinbarungen
für die Speicherbelegung enthält
#include <stdlib.h> |
Beispielprogramm |
Ein komplettes Minimalprogramm für eine Speicheranforderung und
-freigabe kann wie folgt aussehen:
#include <stdio.h>
void main (void)
int *feld;
scanf ("%d",&feldgroesze);
feld = malloc (feldgroesze * Größe des Einzelelements)
{
else {
wir angefordert haben benutzt. /* freigeben des Speichers nach getaner Arbeit */ free (feld);
} |
Hausaufgabe |
Um ein wenig in Übung zu kommen:
Es ist ein Programm zu erstellen, welches eine beliebige Anzahl von Zahlen einliest und daraus den Mittelwert berechnet.
Vorschlag zur Reihenfolge:
...das Obligatorische |
Autor: Sebastian Cyris PCDBascht@aol.com
Dieser C-Kurs dient nur zu Lehrzwecken! Eine Vervielfältigung ist ohne vorherige Absprache mit dem Autor verboten! Die verwendete Software unterliegt der GPL und unterliegt der Software beiliegenden Bestimmungen zu deren Nutzung! Jede weitere Lizenzbestimmung die der benutzten Software beiliegt, ist zu beachten!