16.7 Dynamisches Array
 
Wenn mit der Funktion malloc() ein zusammenhängender Speicherbereich reserviert werden kann, dann muss es auch möglich sein, Speicher für ein Array während der Laufzeit zu reservieren. Bei einem zusammenhängenden Speicher können Sie davon ausgehen, dass dieser in einem Block (lückenlos) zur Verfügung gestellt wird. In dem folgenden Beispiel wird ein solches dynamisches Array erzeugt:
/* dyn_array1.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int *value;
int size, i = 0;
printf("Wie viele Werte benötigen Sie : ");
scanf("%d", &size);
value = (int *)malloc(size*sizeof(int));
if( NULL == value ) {
printf("Fehler bei malloc....\n");
return EXIT_FAILURE;
}
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 EXIT_SUCCESS;
}
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.7
Dynamisch erzeugtes Array
Mit
value = (int *)malloc(size*sizeof(int));
wird ein zusammenhängender Speicherbereich mit size int-Werten reserviert. Danach werden mit
while(i < size) {
printf("Wert für value[%d] eingeben : ", i);
scanf("%d", &value[i]);
i++;
}
diesem Speicherbereich Werte zugewiesen. Zum besseren Verständnis dasselbe Programm nochmals, aber statt mit Arrays nun mit Zeigern:
/* dyn_array2.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int *value;
int size, i=0;
printf("Wie viele Werte benötigen Sie : ");
scanf("%d", &size);
value = (int *)malloc(size*sizeof(int));
if(NULL == value) {
printf("Fehler bei malloc...!!\n");
return EXIT_FAILURE;
}
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 EXIT_SUCCESS;
}
Da *value, value[0] und *(value+1), value[1] immer auf dieselbe Speicheradresse verweisen, ist es egal, wie darauf zugegriffen wird.
Das Programm ist jetzt etwas unflexibel. Was ist, wenn Sie für fünf weitere Elemente Speicherplatz benötigen? Mit der Funktion realloc() wäre dies recht einfach zu realisieren. Aber diese steht jetzt noch nicht zur Debatte. Es ist auch mit malloc() möglich, wenn auch etwas umständlicher. Hier das Beispiel:
/* dyn_array3.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
int *value,*temp;
int i=0, more;
int size, merker = 0;
printf("Wie viele Werte benötigen Sie : ");
scanf("%d", &size);
value = (int *)malloc(size*sizeof(int));
if(NULL == value) {
printf("Fehler bei malloc...!! n");
return EXIT_FAILURE;
}
do {
while(merker < size) {
printf("Wert für value[%d] eingeben : ",merker);
scanf("%d",&value[merker]);
merker++;
}
printf("Neuen Platz reservieren (0=Ende) : ");
scanf("%d",&more);
temp = (int *)malloc(size*sizeof(int));
if(NULL == temp) {
printf("Kann keinen Speicher mehr reservieren!\n");
return EXIT_FAILURE;
}
for(i=0; i<size; i++)
temp[i]=value[i];
size+=more;
value = (int *)malloc(size * sizeof(int));
if(NULL == value) {
printf("Kann keinen Speicher mehr reservieren!\n");
return EXIT_SUCCESS;
}
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 EXIT_SUCCESS;
}
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.8
Dynamisch reserviertes Array dynamisch erweitern
Bevor Sie für das bereits dynamisch reservierte Array erneut Speicherplatz reservieren können, müssen Sie die bereits eingegebenen Werte erst einmal in ein temporär alloziiertes Array zwischenspeichern. Danach kann neuer Speicherplatz für das Array reserviert werden, worein anschließend die Werte aus dem temporären Array zurückkopiert werden. Das alles ist ziemlich aufwändig. Ihnen das jetzt anhand eines char-Arrays (Strings) zu demonstrieren, erspare ich mir zunächst.
|