Teil 10 : Die dynamischen Felder in C

Was machte man bisher, wenn man nicht wußte, wieviel Elemente ein Feld haben soll ? Man erzeugte immer ein Feld mit der maximalen Anzahl der Elemente. Das dieses sehr zu Lasten des Arbeitsspeichers geht kann man sich vorstellen. Was tun wenn man nun mit seinem kostbaren Speicher haushalten will ? Man fängt an dynamisch zu programmieren, was nichts anderes bedeutet, als das man sich nur den Speicher nimmt, den man gerade benötigt.




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;

/*

    Nun berechnen wir, wieviel Speicher ein Feld
    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:
 
 

    /* wichtig! Für malloc stdlib.h einbinden */ 

    #include <stdio.h> 
    #include <stdlib.h> 

    void main (void

      int feldgroesze; 
      int *feld;
       
    /* Feldgröße erfragen */ 
     
      printf ("\nBitte geben sie die Feldgröße an : "); 
      scanf ("%d",&feldgroesze);
       
    /* 
      Speicher anfordern durch 
      feld = malloc (feldgroesze * Größe des Einzelelements)
    */ 
     
      feld = malloc (feldgroesze * sizeof (int));
       
    /* Abfrage, ob ein Fehler auftrat */ 
     
      if (feld == NULL) 
        fprint ("\nZu wenig Speicher!\n");

      else
        fprint ("\nOk, Speicher wurde angefordert\n");
      }
       
    /* 
      Hier steht nun ein Programm, welches den Speicher, den 
      wir angefordert haben benutzt.
    */ 

    /* freigeben des Speichers nach getaner Arbeit */ 

    free (feld); 
    printf ("\nDer Speicher wurde wieder freigegeben!\n"); 

    }


 
 
 
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:

Kleine Hilfe:
Der Mittelwert ist die Summe aller Zahlen geteilt durch deren Anzahl.
 
 
 
 
...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!