• Keine Ergebnisse gefunden

Dynamische Speicherzuweisung

N/A
N/A
Protected

Academic year: 2022

Aktie "Dynamische Speicherzuweisung"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

7. Dynamischer Speicher Bernd Schürmann

Programmieren in C

für Elektrotechniker

Kapitel 8: Dynamischer Speicher

Programmieren in C

Dynamische Speicherzuweisung

Dynamischer Speicher

Statische Variablen

(nicht mit staticin C verwechseln)

• Variablen, die in einem Programm vereinbart werden.

• Sind über einen Bezeichner ansprechbar.

• Lebensdauer ist durch die statische Programmstruktur bestimmt -global: während des gesamten Programmlaufs (globaler Datenbereich), -lokal: während der Ausführung eines Blocks (Stack).

Dynamische Variablen

• Während des Programmlaufs allokiert/angelegt.

• Sind nicht über einen Namen ansprechbar (nur über einen Pointer).

• Lebensdauer ist nicht durch die Programmstruktur bestimmt.

• Liegen auf dem Heap.

Heap: Dynamischer Speicherbereich

• Variablen werden durch Funktionsaufrufe angelegt und gelöscht (in C: malloc(), free()).

• Zugriff nur über Pointer möglich.

• Probleme: - Überlauf, falls zu viel Speicher angefordert.

(2)

7. Dynamischer Speicher Bernd Schürmann

Dynamische Speicherzuweisung

int * sub1 (void) { int * sub1_ptr;

sub1_ptr = malloc (…);

*sub1_ptr = 42;

return sub1_ptr;

}

int * glob_ptr;

int main (void) { sub1();

glob_ptr = malloc (…);

*glob_ptr = 24;

free(glob_ptr);

}

sub1_ptr

2442

glob_ptr

Stack

Heap

Globaler Datenbereich Programm- bereich statische

Pointervariable

statische Pointervariable dynamische Variablen Nur der Pointer wird beim Verlassen der Funktion gelöscht.

Programmieren in C

7. Dynamischer Speicher Bernd Schürmann

Dynamischer Speicher

Reservierung von dynamischem Speicher

#include <stdlib.h>

void * malloc (size_t size);

• mallocmemoryallocation

• Reserviert einen Speicherblock der Größe sizeauf dem Heap (bis er über free()wieder frei gegeben wird).

• Rückgabe:

• Pointer auf den angelegten Speicherblock

(wird bei Zuweisung in einen Pointer auf einen Datentyp gewandelt)

NULL, falls Allokation nicht erfolgreich.

• Beispiel:

int main (void) { int * pointer;

if ((pointer = malloc (sizeof (int))) != NULL) {

*pointer = 3;

printf ("pointer zeigt auf Wert %d\n", *pointer);

free (pointer); /* s.u. */

} else

printf ("Nicht genuegend Speicher verfuegbar\n");

}

(3)

7. Dynamischer Speicher Bernd Schürmann

Änderung der Größe eines dynamischen Speicherblocks

#include <stdlib.h>

void * realloc (void * memblock, size_t size);

memblock: Pointer auf bisher reservierten Speicherblock.

size: neue Speicherblockgröße.

• Rückgabe:

• Pointer auf den Block geänderter Größe.

NULL, falls Größenänderung nicht erfolgreich.

• Beispiel:

int main (void) { int * pointer;

if ((pointer = malloc (sizeof (int))) != NULL) {

*pointer = 3;

} else {

printf ("Nicht genuegend Speicher verfuegbar\n");

return (-1);

}

pointer = realloc ((void *)pointer, 2 * (sizeof(int)));

if (pointer == NULL) {

printf ("Nicht genuegend Speicher verfuegbar\n");

return (-1);

}

pointer[1] = 6;

free (pointer);

}

Programmieren in C Dynamischer Speicher

Freigabe von dynamischem Speicher

#include <stdlib.h>

void free (void * pointer);

pointer: Referenz auf den freizugebenden Speicherblock.

Der aktuelle Parameter kann von beliebigem Pointertyp sein.

von malloc()bzw. realloc()gelieferter Pointer (sonst ist die Funktion undefiniert).

• Achtung: Wird ein Pointer auf ein gültiges Objekt im Heap überschrieben (keine Referenz mehr auf dieses Objekt),

kann auf das Objekt nicht mehr zugegriffen werden.

Speicher wird erst zum Programmende durch Betriebssystem frei.

C besitzt keinen „Garbage Collector“.

• Beispiel:

int main (void) { char * ptr;

char string[] = "Ab in den Heap";

if ((ptr = malloc(strlen(string)+1)) != NULL) { strcpy (ptr, string);

printf ("String im Heap: %s\n", ptr);

free (ptr);

}

(4)

7. Dynamischer Speicher Bernd Schürmann

Tipp zu Speicherlecks

• Häufig wird vergessen, Speicher wieder freizugeben.

Speicherlecks (memory leaks)

• Desktop-Betriebssysteme

nicht ganz so tragisch, da Speicher zu Programmende durch Betriebssystem wieder freigegeben wird.

• Eingebettete Systeme

besitzen oft eingeschränktes Betriebssystem,

so dass der Speicher erst beim „Kaltstart“ wieder frei wird.

• Speicheranforderung und Freigabe immer paarweise programmieren.

mit jedem malloc()auch gleich free()ins Programm einsetzen (zumindest die Notwendigkeit notieren).

Programmieren in C

7. Dynamischer Speicher Bernd Schürmann

Dynamischer Speicher

Beispiel 1: Array beliebiger Größe anlegen

• Größe eines Array zur Übersetzungszeit meist noch nicht bekannt.

meist werden zur Vorsicht viel zu große Arrays angelegt.

• Sinnvoller: Array zur Laufzeit auf dem Heap anlegen, wenn dessen Größe bekannt ist.

• Beispiel:

int main (void) {

int * ptrArray = NULL;

int anzahl = 0, i;

printf ("Anzahl der Array-Elemente: ");

scanf ("%d",&anzahl);

ptrArray = malloc (sizeof (int) * anzahl);

for (i = 0; i < anzahl; i++) { ptrArray[i] = i;

printf ("Array[%d]: %d\n", i, ptrArray[index]);

}

free (ptrArray);

return 0;

}

(5)

7. Dynamischer Speicher Bernd Schürmann

Beispiel 2: Verkettete Listen

• Lineare Liste beliebiger Größe.

• Elemente liegen nicht hintereinander im Speicher (nicht wie beim Array).

• Es können jederzeit beliebig viele neue Elemente angelegt werden.

Daten Pointer anchor

Daten Pointer

Daten Pointer

Daten NULL

Daten Pointer Einfügen eines

neuen Elements

Löschen eines Elements

(Speicher bleibt allokiert, aber nicht mehr zugreifbar)

Referenzen

ÄHNLICHE DOKUMENTE

verschachtelten Prozeduren m¨ ussen viele Zugriffslinks verfolgt werden. Abhilfe: Displays

Speicher wird explizit zur Laufzeit alloziert und freigegeben Dynamische Allokation ist notwendig, wenn. • der Speicherbedarf zur Compile-Zeit

Das Institut für Technische Informatik erforscht Systemarchitekturen und Entwurfsmethoden, die es erlauben, solche Systeme robust auszulegen, so dass ihre Funktionalität selbst

Automatische Generierung von Produktionscode für Seriensteuergeräte Automatic Production Code Generation for Electronic Control

Margarete Hertrampf

Für die konfigurier- bare Hardware wird sich zeigen, dass durch Benutzung von standardisierten Schnittstellen und eines Betriebssystems unabhängig von der Zielplattform nur

In 1970er wurde für den Mehrzweckspeicher Gumpen an der Waldnaab (Bayern) eine KNU durchgeführt.. - In einem Einzugsgebiet von einigen

Bei einem Auftritt in Stepanakert, der Hauptstadt der Region, trat der armenische Premier für eine Vereinigung Berg-Karabachs mit Armenien ein und wurde mit den Worten