Programmiersprache C/C++

Dynamische Speicherplatzzuordnung

malloc

  #include <stdlib.h>

  void *malloc(size_t size);
malloc reserviert einen Speicherbereich von size Bytes auf dem Heap.
Damit kann ein Programm Speicherplatz genau nach Bedarf und exakt in der benötigten Größe reservieren.
Der Heap wird für die dynamische Reservierung von Speicherbereichen variabler Größe benutzt.
Vor allem für dynamische Datenstrukturen wie beispielsweise Bäume und Listen wird diese Art der Speicherplatzreservierung auf dem Heap genutzt.

Es findet keine Initialisierung des zur Verfügung gestellten Speicherbereichs statt.
Wenn der Parameter size den Wert 0 hat, liefert malloc NULL zurück.

Rückgabewert:
malloc liefert bei fehlerfreier Ausführung einen Zeiger, der auf den neu reservierten Speicherbereich zeigt.
Wenn kein Speicherbereich ausreichender Größe zur Verfügung steht, dann ist der Rückgabewert NULL.

Beispiel:

  #include <stdio.h>
  #include <string.h>
  #include <alloc.h>
  #include <process.h>

  int main(void)
  {
    char *str;

    /* Speicherplatz fuer Zeichenkette str zuweisen */
    if ((str = (char *) malloc(10)) == NULL)
    {
      printf("Nicht genuegend Speicherplatz verfuegbar\n");
      exit(1);                       /* Programm beenden */
    }

    strcpy(str, "Hello");
    printf("String is %s\n", str);

    /* Speicherplatz wieder frei geben */
    free(str);

    return 0;
  }

realloc

  #include <stdlib.h>
 
  void *realloc(void *block, size_t size);
Ändert die Größe eines reservierten Blocks im Hauptspeicher.
realloc verändert die Größe eines zuvor reservierten Speicherblocks auf size Bytes.
Enthält size den Wert NULL, so wird der Speicherblock freigegeben und NULL zurückgeliefert.
block muß auf die Startadresse eines Speicherblocks zeigen, der zuvor mit einem Aufruf von malloc, calloc oder realloc ermittelt wurde. Wenn block ein NULL-Zeiger ist, verhält sich realloc wie malloc.
realloc ändert die Größe des reservierten Speicherblocks und kopiert dazu den Blockinhalt an eine neue Adresse, falls nötig.
Falls der Wert von size 0 ist, wird der Speicherblock freigegeben und realloc gibt NULL zurück.

Rückgabewert:
realloc gibt die neue Adresse des Speicherblocks zurück, die von der bisherigen Adresse abweichen kann.
Ist die Größenänderung nicht möglich, gibt realloc NULL zurück.


calloc

  #include <stdlib.h>

  void *calloc(size_t nitems, size_t size);
Reserviert Hauptspeicher.
Über diese Funktion wird der Heap verwaltet, in dem Platz für dynamische Variablen belegt und wieder freigegeben werden kann. Viele Datenstrukturen, wie z.B. Bäume und Listen, können nur auf dem Heap untergebracht werden.
calloc belegt einen Speicherbereich von nitems * size Bytes, die mit 0 initialisiert werden.

Rückgabewert:
calloc liefert einen Zeiger auf den neu reservierten Speicherbereich. Wenn kein Speicherbereich ausreichender Größe zur Verfügung steht, oder wenn nitems oder size den Wert 0 haben, liefert calloc NULL zurück.


free

  #include <stdlib.h>

  void free(void *block);
Gibt einen reservierten Speicherblock wieder frei.
free gibt einen zuvor mit calloc, malloc oder realloc reservierten Block wieder frei.

Rückgabewert: keiner

Bemerkungen zu DOS-Systemen

In den kleinen Datenmodellen wird mit near-Zeigern gearbeitet, der Heap liegt zwischen dem oberen Ende des Datensegments und dem unteren Ende des Stack. Der Heap reserviert den gesamten hier zur Verfügung stehenden Speicherbereich bis auf einige Bytes direkt unterhalb der Stack-Spitze, die für Stack-Vergrößerungen und für das Betriebssystem reserviert sind.
In den großen Datenmodellen wird mit far-Zeigern gearbeitet, der Heap beginnt oberhalb des Stack und endet mit der höchsten vom System zur Verfügung gestellten Speicheradresse.


Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 17.12.1995