14.7 Dynamische Arrays 

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 = 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; }
Abbildung 14.7 Dynamisch erzeugtes Array
Mit
value = 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 zeige ich hier 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 = 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 Funktion steht jetzt noch nicht zur Debatte. Die Speicherzuweisung ist auch mit malloc() möglich, wenn auch etwas umständlicher. Hier sehen Sie 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 = 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 = 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; }
Abbildung 14.8 Ein 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 alloziertes Array zwischenspeichern. Danach kann neuer Speicherplatz für das Array reserviert werden, in den anschließend die Werte aus dem temporären Array zurückkopiert werden. Das alles ist ziemlich aufwendig. Ihnen das jetzt anhand eines char-Arrays (Strings) zu demonstrieren, erspare ich mir zunächst.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.