ein Kapitel zurück                                           ein Kapitel weiter

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 zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf