Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...

Ähnliche Präsentationen


Präsentation zum Thema: "Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben..."—  Präsentation transkript:

1 Dynamischer Speicher

2 Ein Vergleich aus dem täglichen Leben...

3 Die Klasse BKI1 (20 Schüler) will in einem Jahr Urlaub (evtl. mit den bis dort existierenden neuen Freunden) in der Südsee machen und bucht deshalb vorsorglich schon jetzt Zimmer in einem Hotel. Wieviel Zimmer sollen in dem Hotel reserviert, also schon heute gebucht werden?

4 Fall 1: Es werden nur 20 Zimmer reserviert. Die neuen Freunde müssen deshalb in dem Hotel nicht reservierte Zimmer belegen. Dies kann zu durch äußere Gewalteinwirkung verursachten körperlichen Fehlfunktionen der neuen Freunde führen, wenn sie z.B. in schon (von anderen Personen) reservierten Zimmern übernachten.

5 Fall 2: Es werden mehr als 20 Zimmer reserviert (z.B. 100). Falls es bis dort dann keine neuen Freunde gibt, oder einige Schüler urplötzlich einen Fahrrad-Urlaub in Holland machen (und deswegen den Südsee-Urlaub absagen), werden reservierte Zimmer nicht belegt. Dies führt zu Geldverschwendung.

6 Zurück zur Programmiersprache C

7 In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen wird (nach dem Aufruf der Funktion), wird dieser Speicherbereich automatisch wieder freigegeben (nicht mehr reserviert).

8 Beispiel:

9 void f(){ int myfeld[10]; //... } int main(){ f(); //... } Erst wenn f aufgerufen wird, wird Speicher für myfeld auf dem Stack reserviert. Wieviel Byte sind dies ? 10 * Speicherbedarf (integer) Nach dem Aufruf wird der für int myfeld[10 ] reservierte Speicherbereich automatisch wieder freigegeben.

10 Beispiel: Man will die von einem Anwender bestimmte Anzahl von Zahlen in einem Feld abspeichern.

11 int main(){ int myfeld[1000]; //... } Welchen Nachteil hat dies bezüglich des Speicherplatzverbrauchs Der Anwender kann weniger Speicher – als reserviert – verbrauchen (z.B. bei Eingabe nur einer Zahl). Dies nennt man dann Speicherverschwendung. Der Anwender kann mehr Speicher – als reserviert – verbrauchen (z.B. bei Eingabe von 2000 Zahlen). Dies nennt man dann Überschreiben nicht reservierten Speichers.

12 Um dies zu vermeiden kann der Anwender – während der Laufzeit des Programms – so viel Speicher reservieren, wie er benötigt. Im Gegensatz zum Beispiel oben wird diese Reservierung nicht beim Compilieren, sondern während des Programmlaufs gemacht und heißt deshalb dynamischer Speicher(reservierung).

13 Realisierung in C

14 #include "stdafx.h" #include

15 int main(){ int anz, zahl, i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

16 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

17 //... siehe letzte Folie scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

18 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

19 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

20 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

21 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

22 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

23 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

24 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

25 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

26 ... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int)); for(i=0; i

27 In panf wird die Anfangsadresse des reservierten Speichers zurückgegeben. Was geschieht aber, wenn der Programmierer "Nimmersatt" mehr Speicher vom Betriebssytem will, als dieses zur Verfügung hat? Welche Anfangsadresse soll es zurückgeben? panf = (int *) malloc (anz*sizeof(int));

28 Es darf keine Anfangsadresse zurückgegeben werden. Es muss also einen bestimmten Wert geben, der von allen anderen Zeigerwerten (Adressen) verschieden ist und der nicht die Adresse irgendeiner Variablen enthält: der sogenannte "Null- Zeiger" (Nullpointer) mit dem Wert NULL panf = (int *) malloc (anz*sizeof(int));

29 Es besteht ein großer Unterschied zwischen dem Nullpointer und dem nicht initialisierten Pointer: Für den Nullpointer ist garantiert, dass er nirgendwohin zeigt, ein nicht initialisierter Zeiger hingegen kann überallhin zeigen. Über einen Nullpointer kann kein Zugriff erfolgen (also *NULL nicht möglich). panf = (int *) malloc (anz*sizeof(int));

30 WICHTIG: Die Verwendung von malloc sollte deshalb immer wie folgt geschehen:

31 panf = (int *) malloc (anz*sizeof(int)); if(panf != NULL){ // Anweisungen //... free(panf); } panf gleich NULL bedeutet: Vom Betriebssystem kann kein Speicher mehr reserviert werden, weil z.B. schon vorher im Programm viel Speicher reserviert wurde. versuche vom Betriebssystem Speicher zu reservieren

32 panf = (int *) malloc (anz*sizeof(int)); if(panf != NULL){ // Anweisungen //... free(panf); } Wenn der Speicher nicht freigegeben wird und man in diesem Programm nochmals Speicher reservieren will, kann es sein, dass kein freier Speicher mehr zur Verfügung steht. Hätte man dagegen den alten Speicher wieder freigegeben, könnte das Betriebssystem diesen wieder vergeben! Warum soll dieser Speicher wieder freigegeben werden?

33 Ein Vergleich: Angenommen ein Hotel hat 10 Zimmer und nach der Beendigung des Urlaubs wird ein Hotelzimmer nicht wieder (für eine Neureservierung) freigegeben. Nach wie viel Vermietungen muss der Hotelbesitzer dann ein neues Hotel kaufen, um wieder Zimmer vermieten zu können?

34 Nach 10 Vermietungen ! Was wäre deshalb eine bessere Strategie, um einen teuren Hotelkauf zu vermeiden?

35 Jedes Hotelzimmer (evtl. nach einer Grundreinigung) wieder neu zu einer Reservierung freizugeben (d.h. es wieder neu zu vermieten).

36 Was macht das gleiche Programm, aber ohne die Anweisung: panf = (int *) malloc (anz*sizeof(int));

37 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); for(i=0; i

38 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); for(i=0; i

39 int main(){ int anz, zahl,i; int *panf; printf("Anzahl ein scanf("%d", &anz); for(i=0; i

40 int main(){ int anz, zahl,i; int *panf; printf("Anzahl ein scanf("%d", &anz); for(i=0; i

41 Was macht das gleiche Programm, aber ohne die Zuweisung panf = also nur: (int *) malloc (anz*sizeof(int)); Mit malloc wird ja Speicher reserviert...

42 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i

43 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i

44 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i

45 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i

46 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i

47 int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i


Herunterladen ppt "Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben..."

Ähnliche Präsentationen


Google-Anzeigen