![Page 1: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/1.jpg)
DynamischerSpeicher
![Page 2: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/2.jpg)
Ein Vergleich aus dem täglichen Leben ...
![Page 3: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/3.jpg)
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?
![Page 4: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/4.jpg)
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.
![Page 5: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/5.jpg)
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.
![Page 6: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/6.jpg)
Zurück zur Programmiersprache C
![Page 7: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/7.jpg)
In einer Funktion wird z.B. mit der Deklarationint 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).
![Page 8: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/8.jpg)
Beispiel:
![Page 9: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/9.jpg)
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.
![Page 10: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/10.jpg)
Beispiel:Man will die von einem
Anwender bestimmte Anzahl von Zahlen in einem Feld
abspeichern.
![Page 11: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/11.jpg)
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.
![Page 12: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/12.jpg)
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).
![Page 13: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/13.jpg)
Realisierung in C
![Page 14: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/14.jpg)
#include "stdafx.h"#include <stdio.h>#include <malloc.h>
![Page 15: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/15.jpg)
int main(){ int anz, zahl, i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }}
eingelesener Wert wird in anz gespeichert
für anz integer-Werte
panf zeigt auf das erste Element des reservierten Speichers
alternativ möglich (gleichbedeutend):
reserviert dynamisch Speicher...
sizeof berechnet den Speicherbedarf. Bei MS-VC++: Speicherbedarf(integer) = 4 Byte
Annahme: anz = 2
Dieser cast-Operator gibt an, dass auf einen integer-Wert gezeigt wird.
![Page 16: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/16.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }...
eingelesener Wert wird in anz gespeichert
für anz integer-Werte
panf zeigt auf das erste Element des reservierten Speichers
alternativ möglich (gleichbedeutend):
reserviert dynamisch Speicher...
sizeof berechnet den Speicherbedarf. Bei MS-VC++: Speicherbedarf(integer) = 4 Byte
Annahme: anz = 2
Wichtig:Der reservierte Speicher ist zusammenhängend und hat deshalb keine Lücken. Wenn man also die erste Adresse und die Größe des reservierten Speichers kennt, weiß man alle reservierten Speicherzellen.
![Page 17: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/17.jpg)
// ... siehe letzte Folie scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 ?panf
Welchen Wert hat panf an dieser Stelle ?
Annahme:Die Variable panf werde an der Adresse 700 gespeichert.
![Page 18: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/18.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
??
02020203 ?0204
?
0206
?0205
0207??
?
02000201
Speicherreservierung mit malloc für : 2 · sizeof(int) = 2 · 4 Byte = 8 Byte.
Annahme: Speicherbereich beginnt bei Adresse 0200
![Page 19: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/19.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
??
02020203 ?0204
?
0206
?0205
0207??
?
02000201
Annahme: zahl =1000
![Page 20: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/20.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
??
02020203 ?0204
?
0206
?0205
0207??
?
02000201
*(0200 + 0 · 4)
Annahme: zahl =1000
![Page 21: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/21.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
0206
?0205
0207??
?
02000201
1 0 0 0
Annahme: zahl =1000
*(0200 + 0 · 4)
Bemerkung:Wenn die Variable zahl statt 1000 den Wert 12345 hätte, dann würde 12345 in den 4 Byte an den Adressen 200 bis 203 gespeichert werden.
![Page 22: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/22.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
0206
?0205
0207??
?
02000201
1 0 0 0
Annahme: zahl =2000
![Page 23: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/23.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
0206
?0205
0207??
?
02000201
1 0 0 0*(0200 + 1 · 4)
Annahme: zahl =2000
![Page 24: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/24.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
02060205
0207
02000201
1 0 0 0*(0200 + 1 · 4)
Annahme: zahl =2000
![Page 25: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/25.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
02060205
0207
02000201
1 0 0 0
2 0 0 0
![Page 26: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/26.jpg)
... scanf("%d", &anz); panf = (int *) malloc (anz*sizeof(int));
for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; } free(panf);}
0700 0200panf
020202030204
02060205
0207
02000201
1 0 0 0
2 0 0 0
gibt reservierten Speicher wieder frei.
![Page 27: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/27.jpg)
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));
![Page 28: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/28.jpg)
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));
![Page 29: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/29.jpg)
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));
![Page 30: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/30.jpg)
WICHTIG:Die Verwendung von malloc sollte deshalb immer wie folgt geschehen:
![Page 31: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/31.jpg)
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
![Page 32: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/32.jpg)
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?
![Page 33: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/33.jpg)
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?
![Page 34: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/34.jpg)
Nach 10 Vermietungen !
Was wäre deshalb eine bessere Strategie, um einen teuren Hotelkauf zu vermeiden?
![Page 35: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/35.jpg)
Jedes Hotelzimmer (evtl. nach einer Grundreinigung) wieder neu zu einer Reservierung freizugeben (d.h. es wieder neu zu vermieten).
![Page 36: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/36.jpg)
Was macht das gleiche Programm, aber ohne die Anweisung:
panf = (int *) malloc (anz*sizeof(int));
![Page 37: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/37.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; }
0100 ?panf
? bedeutet:irgendein unbekannter, zufälliger Wert.Zum Beispiel: 0815
Welchen Wert hat panf an dieser Stelle des Programms ?
Annahme: zahl = 13
*(0815 + 0 · 4)13
![Page 38: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/38.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl; }
Was steht an der Adresse 0815 im Arbeitsspeicher ?
Der Programmierer weiß es nicht, denn er hat an dieser Adresse keinen Speicherplatz reservieren lassen und diesen entsprechend belegt.
In einem schlimmen Fall könnte an der Adresse 0815 zum Beispiel...
ein Teil des Betriebssystems stehen !
*(0815 + 0 · 4)
0100 0815panf
13
![Page 39: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/39.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl ein scanf("%d", &anz); for(i=0; i<anz; i+ scanf("%d", &zah *(panf+i)=zahl; }
0815 Teildes
Syst.Betr.
*(0815 + 0 · 4)
0100 0815panf
13
![Page 40: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/40.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl ein scanf("%d", &anz); for(i=0; i<anz; i+ scanf("%d", &zah *(panf+i)=zahl; }
0815
Dieser Teil des Betriebssystems wird überschrieben !!!!
0 0 1 3
*(0815 + 0 · 4)
0100 0815panf
13
![Page 41: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/41.jpg)
Was macht das gleiche Programm, aber ohne die Zuweisung panf =also nur:(int *) malloc (anz*sizeof(int));
Mit malloc wird ja Speicher reserviert ...
![Page 42: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/42.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }}
reserviert dynamisch Speicher 8 Byte
Was veranlasst diese Anweisung? (Annahme anz = 2)
![Page 43: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/43.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }}
Welchen Wert hat panf an dieser Stelle des Programms ?
Annahme: zahl = 13
0100 ?panf
? bedeutet:irgendein unbekannter, zufälliger Wert.Zum Beispiel: 0815
*(0815 + 0 · 4)
13
![Page 44: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/44.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }} 0100 0815panf
Was steht an der Adresse 0815 im Arbeitsspeicher ?
Der Programmierer weiß es nicht, denn er hat an dieser Adresse keinen Speicherplatz reservieren lassen und diesen entsprechend belegt.
In einem schlimmen Fall könnte an der Adresse 0815 zum Beispiel...
ein Teil des Betriebssystems stehen !
13
![Page 45: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/45.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }} 0100 0815panf
0815 Teildes
Syst.Betr.
13
![Page 46: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/46.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }} 0100 0815panf
13
0815
0 0 1 3
![Page 47: Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben](https://reader036.vdokument.com/reader036/viewer/2022070310/55204d6549795902118bac88/html5/thumbnails/47.jpg)
int main(){ int anz, zahl,i; int *panf; printf("Anzahl eingeben:"); scanf("%d", &anz); (int *) malloc (anz*sizeof(int)); for(i=0; i<anz; i++){ scanf("%d", &zahl); *(panf+i)=zahl;// panf[i]=zahl; }} 0100 0815panf
0815
0 0 1 3
Mit malloc wurde zwar Speicher reserviert, doch leider nirgends (in keiner Variablen wie z.B. panf) festgehalten, wo dieser reservierte Speicher beginnt. Der reservierte Speicher kann also nicht benutzt werden (Speicherleiche). Dagegen wurde nicht reservierter Speicher benutzt, was zu schweren Problemen führt.