Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dynamischer Speicher und Struktur. Beispiel: In einem Test-Programm werden die Anzahl, die Länge, Breite und Höhe mehrerer Räume gespeichert. Der Anwender.

Ähnliche Präsentationen


Präsentation zum Thema: "Dynamischer Speicher und Struktur. Beispiel: In einem Test-Programm werden die Anzahl, die Länge, Breite und Höhe mehrerer Räume gespeichert. Der Anwender."—  Präsentation transkript:

1 Dynamischer Speicher und Struktur

2 Beispiel:

3 In einem Test-Programm werden die Anzahl, die Länge, Breite und Höhe mehrerer Räume gespeichert. Der Anwender gibt die Anzahl der abzuspeichernden Räume ein. Die Länge, Breite und Höhe werden vorläufig (zu Testzwecken) durch das Programm festgelegt.

4 Ein Raum wird durch folgende Struktur realisiert:

5 struct dtraum{ int l; int b; int h; };

6 Realisieren Sie das Programm durch ein Feld, dessen einzelne Elemente jeweils eine Struktur bilden.

7 #include "stdafx.h" #include struct dtraum{ int l; int b; int h; }; // gleich geht es weiter...

8 int main(){ int anz,i; struct dtraum v[1000]; printf("Anzahl eingeben =\n"); scanf("%d",&anz); for(i=0;i

9 Die Funktion malloc kann während der Laufzeit des Programms eine gewünschte Menge Speicher (vom Betriebssystem) organisieren. Welche Angabe braucht man dann, um auf diesen Speicher zuzugreifen ?

10 Man braucht die Anfangsadresse dieses reservierten Speicherbereichs. Die Funktion malloc liefert diese Anfangsadresse zurück.

11 Beispiel:

12 int main(){ int *pint; pint = (int *) malloc(3*sizeof(int)); // pint = (int *) malloc(12); } reserviert Speicher für 3 * Speicherbedarf(integer) malloc verlangt, daß man - durch den cast Operator (..) - den Datentyp angibt, auf den die Anfangsadresse des Speicherbereichs zeigt nicht empfehlenswert: falls man weiß wieviel Speicher 3 Integer belegen, könnte man auch die Anzahl der Bytes direkt angeben Anfangsadresse des reservierten Speichers

13 Realisieren Sie das vorige Programm, in dem die Räume in einem Feld abgespeichert wurden, durch die Verwendung von dynamischem Speicher.

14 #include "stdafx.h" #include struct dtraum{ int l; int b; int h; }; // gleich geht es weiter...

15 int main(){ int i; int anz=0; struct dtraum *pr; printf("Anzahl eingeben\n\n"); scanf("%d",&anz); pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum)); reserviert Speicher für... Hier wird nachher der Anfang des dynamischen Speichers (in einem Zeiger) festgehalten. Welchen Wert hat pr an dieser Stelle ? anz Speicherelemente mit dem Datentyp struct dtraum 0100? pr berechnet den Speicherbedarf von der Struktur dtraum : 3 · Speicherbedarf(integer) = 12 Byte Annahme: Die Variable pr werde an der Adresse 0100 gespeichert.

16 ... pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum)); for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } Annahme: anz = ? pr gleiche Befehle, nur anders geschrieben

17 ... pr = (struct dtrau (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } ? ? ? 0508 ? pr Speicherreservierung für : 2 · sizeof(dtraum) = 2 · 3 · 4 Byte. ?... ? ? ? ? ? ? ? Annahme: Speicherbereich beginnt bei Adresse 0500

18 ... pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } ? ? ? 0508 ? pr ?... ? ? ? ? ? ? ? *( · 12)

19 ? 0508 ? ?... ? ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

20 ? 0508 ? ?... ? ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr 0 *( · 12)

21 ?... ? ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

22 ?... ? ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

23 ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

24 ? ? ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

25 ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

26 ? ? ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

27 ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

28 ? ? pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

29 pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr *( · 12)

30 pr = (struct dtraum (anz*sizeof(st for(i=0;il=i; // pr[i].l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } pr free(pr); reservierten Speicher wieder freigeben

31 WICHTIG: Die Verwendung von malloc sollte immer wie folgt geschehen:

32 pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum)); if(pr != NULL){ // z.B. Anweisungen // siehe oben... free(pr); } Wenn pr den Wert NULL (0) hat bedeutet dies: Vom Betriebssystem kann kein Speicher mehr reserviert werden, weil z.B. schon vorher im Programm viel Speicher reserviert wurde.

33 pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum)); if(pr != NULL){ // Anweisungen //... free(pr); } pr->l=100; printf("%d", pr->l); Was geschieht, wenn nach der Freigabe des reservierten Speichers auf diesen Speicher zugegriffen wird? Es kann (muss aber nicht) zur Laufzeit eine Fehlermeldung erscheinen (übliche blaue Fenster...). Wenn keine Fehlermeldung erscheint, kann sich dieser Fehler später im Programm sehr unangenehm bemerkbar machen...

34 Was macht das gleiche Programm, aber ohne die Anweisung: pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum));

35 int main(){ int i; int anz=0; struct dtraum *pr; printf("Anzahl eingeben\n\n"); scanf("%d",&anz); for(i=0;ib=i+10; (pr+i)->h=i+20; } 0100? pr Welchen Wert hat pr an dieser Stelle des Programms ? ? bedeutet: irgendein unbekannter, zufälliger Wert. Zum Beispiel: 0815

36 int main(){ int i; int anz=0; struct dtraum *pr; printf("Anzahl eingeben\n\n"); scanf("%d",&anz); for(i=0;ib=i+10; (pr+i)->h=i+20; } pr Was steht an der Adresse 0815 im Arbeitsspeicher ? Der Programmier weiß es nicht, denn er hat an dieser Adresse keinen Speicherplatz reservieren lassen und diesen entsprechend belegt. Als schlimmer Fall könnte an der Adresse 0815 zum Beispiel... ein Teil des Betriebssystems stehen!

37 int main(){ int i; int anz=0; struct dtraum *pr; printf("Anzahl ein scanf("%d",&anz); for(i=0;ib=i+10; (pr+i)->h=i+20; } pr 0815Teil des Syst Betr.

38 int main(){ int i; int anz=0; struct dtraum *pr; printf("Anzahl ein scanf("%d",&anz); for(i=0;ib=i+10; (pr+i)->h=i+20; } pr Dieser Teil des Betriebssystems wird überschrieben 0 0

39 Hier das ganze Programm...

40 #include "stdafx.h" #include struct dtraum{ int l; int b; int h; }; int main(){ int i; int fehler=0; int anz=0; struct dtraum *pr; printf("Bitte Anzahl der Raeume eingeben =\n"); scanf("%d",&anz); pr = (struct dtraum *) malloc (anz*sizeof(struct dtraum)); if(pr!=NULL){ for(i=0;i l=i; (pr+i)->b=i+10; (pr+i)->h=i+20; } free(pr); }

41 if(pr==NULL) printf("Es gibt keinen freien Speicher mehr"); // Nur zum Test: Zugriff auf freigegebenen Speicher pr->l=100; printf("%d", pr->l); return 0; }

42 Übungsaufgaben: Siehe Aufgabenblatt


Herunterladen ppt "Dynamischer Speicher und Struktur. Beispiel: In einem Test-Programm werden die Anzahl, die Länge, Breite und Höhe mehrerer Räume gespeichert. Der Anwender."

Ähnliche Präsentationen


Google-Anzeigen