Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 16 Dynamische Speicherverwaltung
  gp 16.1 Das Speicherkonzept
  gp 16.2 Speicheralloziierung mit malloc()
  gp 16.3 Die Mysterie von NULL
    gp 16.3.1 NULL für Fortgeschrittene
    gp 16.3.2 Was jetzt – NULL, 0 oder \0 ... ?
    gp 16.3.3 Zusammengefasst
  gp 16.4 Speicherreservierung und ihre Probleme
  gp 16.5 free() – Speicher wieder freigeben
  gp 16.6 Die Freispeicherverwaltung
    gp 16.6.1 Prozessinterne Freispeicherverwaltung
  gp 16.7 Dynamisches Array
  gp 16.8 Speicher dynamisch reservieren mit realloc und calloc
  gp 16.9 Speicher vom Stack anfordern mit alloca (nicht ANSI C)
  gp 16.10 free – Speicher wieder freigeben
  gp 16.11 Zweidimensionale dynamische Arrays
  gp 16.12 Wenn die Speicheralloziierung fehlschlägt
    gp 16.12.1 Speicheranforderung reduzieren
    gp 16.12.2 Speicheranforderungen aufteilen
    gp 16.12.3 Einen Puffer konstanter Größe verwenden
    gp 16.12.4 Zwischenspeichern auf Festplatte vor der Alloziierung
    gp 16.12.5 Nur so viel Speicher anfordern wie nötig


Galileo Computing - Zum Seitenanfang

16.7 Dynamisches Array  toptop

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;
}

Abbildung
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;
}

Abbildung
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.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de