|
![ein Kapitel weiter](../weiter.gif)
Wie können wir nun ein Array dynamisch machen? Nun da wir ja mittels
malloc einen ZUSAMMENHÄNGENDEN Speicher reservieren und sie ja schon
den Bezug zwischen Zeigern und Arrays kennen dürfte dies kein Problem sein.
Mit zusammenhängenden Speicher ist gemeint, dass wenn wir zum Beispiel
einen Speicher von 20 Bytes reservieren, das man davon ausgehen kann
das diese 20 Bytes in einem Block vorhanden sind. Und nicht hier mal
5 Bytes, 3 weitere Bytes wieder mal 5 Bytes usw.
Nun wollen wir uns ein Programm ansehen, wo wir ein dynamische Array
erzeugen........
/*Download:darry1.c*/
#include <stdio.h> #include <string.h>
int main() {
int *value; int size; int i=0;
printf("Für wievielen Werten wollen sie Platz reservieren : "); scanf("%d",&size);
value=(int *)malloc(size*sizeof(int)); if(value == NULL) {
fprintf(stderr,"Konnte keinen Speicherplatz reservieren......\n"); exit(0); } while(i<size) {
printf("Wert für value[%d] eingeben : ",i); scanf("%d",&value[i]); i++; }
printf("Hier Ihre Werte\n"); for(i=0; i<size; i++) printf("value[%d] = %d\n",i,value[i]);
return 0; }
|
Mit......
value=(int *)malloc(size*sizeof(int));
...reservieren wir einen Zusammenhängenden Speicher mit size int-Werten.
Diesen Speicher weisen wir mittels.....
while(i<size)
{
printf("Wert für value[%d] eingeben : ",i);
scanf("%d",&value[i]);
i++;
}
...Werte zu. Wenn sie nicht wissen wieso dies funktioniert, sollten
sie sich nochmals die Kapitel zu den Zeigern ansehen. Zum besseren
Verständnis das gleiche Programm nochmals, aber ohne Arrays sondern
in nur mit den Zeigern..........
/*Download:darry2.c*/
#include <stdio.h> #include <string.h>
int main() {
int *value; int size; int i=0;
printf("Für wievielen Werten wollen sie Platz reservieren : "); scanf("%d",&size);
value=(int *)malloc(size*sizeof(int)); if(value == NULL) {
fprintf(stderr,"Konnte keinen Speicherplatz reservieren......\n"); exit(0); } while(i<size) {
printf("Wert für value[%d] eingeben : ",i); scanf("%d",(value+i)); i++; }
printf("Hier Ihre Werte\n"); for(i=0; i<size; i++) printf("value[%d] = %d\n",i,*(value+i));
return 0; }
|
Jetzt wird es bei manchen wieder klick gemacht haben. Da ja
*value und value[0] und *(value+1) und value[1] immer auf dem
selben Speicherplatz verweisen, ist es egal wie wir darauf zugreifen.
Nun ist das Programm etwas unflexibel. Was ist wenn sie für 5 Elemente
Speicherplatz reservieren, aber jetzt nochmals gerne 5 Element ins
Array einfügen wollen. Dazu fehlt uns eigentlich noch das Wissen
der Funktion realloc, mit der dies einfach zu reallisieren ist.
Aber auch mit malloc ist dies möglich. Wenn auch nicht etwas Umständlich.......
/*Download:darry3.c*/
#include <stdio.h> #include <string.h>
static int size; static int merker;
int main() {
int *value,*temp; int i=0; int more;
printf("Für wievielen Werten wollen sie Platz reservieren : "); scanf("%d",&size); merker=0;
value=(int *)malloc(size*sizeof(int)); if(value == NULL) {
fprintf(stderr,"Konnte keinen Speicherplatz reservieren......\n"); exit(0); } do{
while(merker<size) {
printf("Wert für value[%d] eingeben : ",merker); scanf("%d",&value[merker]); merker++; }
printf("Speicherplatz ist alle. Neuen Reservieren, wieviel(0=Ende) : "); scanf("%d",&more); temp=(int *)malloc(size*sizeof(int)); for(i=0; i<size; i++) temp[i]=value[i]; size+=more; value=(int *)malloc(size*sizeof(int)); for(i=0; i<size; i++) value[i]=temp[i]; }while(more!=0);
printf("Hier Ihre Werte\n"); for(i=0; i<size; i++) printf("value[%d] = %d\n",i,value[i]);
return 0; }
|
Bevor wir hier unser bereits dynamisch Allokierte Array erneut erweitern,
müssen wir das Array erst mal in ein Temporär allokiertes Array kopieren.
Nun können wieder Speicherplatz für unser Array reservieren. Als nächstes
müssen wir erneut die Werte vom Temporären Array in unser Hauptarray zurückkopieren.
Wie gesagt diese Methode ist aus Perfomancegründen nicht so gut.
Denn bei größeren Array geht durch das Aufwendige Hin-und-Her-Kopieren
einen Menge Zeit verloren.
Weiterhin möchte ich darauf hinweisen, das bei diesem Programm keine Überprüfung
stattfindet ob Erfolgreich Speicher reserviert werden konnte.
Sie werden in einem der nächsten Kapitel eine bessere Möglichkeit, zu unserem
Programm kennenlernen.
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|