Roland: Arrays in C

Hallo,

muß ich beim deklarieren/initialisieren eines Arrays in C immmer vorher schon wissen, wieviele Elemente es umfassen soll?

Ich kenne das aus php so, daß sich die Anzahl der Elemente durchaus im Verlaufe des "Befüllens" ergeben kann. In allen C Tutorials, die ich so finde, steht, daß ein Array in C

datentyp array[AnzahlElemente] deklariert wird.

Was ist denn, wenn ich vorher noch gar nicht so genau weiß, wieviele Elemente ins Array hinein sollen?

Roland

  1. Hallo Roland,

    Was ist denn, wenn ich vorher noch gar nicht so genau weiß, wieviele Elemente ins Array hinein sollen?

    Pointer deklarieren und dann den Speicher mit einer der *alloc-Funktionen reservieren.

    Gruß, Jürgen

  2. Hallo,

    muß ich beim deklarieren/initialisieren eines Arrays in C immmer vorher schon wissen, wieviele Elemente es umfassen soll?

    Ja. Durch Definition eines klassisches Array in C, also etwas wie:

      
    int zahlen[7];  
    
    

    wird Speicher auf dem Stack reserviert, dies passiert aber schon bei der Initialisierung. Während der Laufzeit daran herum zu ändern ist erstmal nicht vorgesehen.

    Was ist denn, wenn ich vorher noch gar nicht so genau weiß, wieviele Elemente ins Array hinein sollen?

    Üblicherweise wird Speicher, der erst zur Laufzeit angefordert wird (z.b. weil erst dann bekannt ist, wieviel benötigt wird), vom Heap angefordert, z.b. mittels der Stdlib-Funktion malloc und einem Zeiger:

      
    int groesse = 5;  
    ...  
    int *zahlen = (int *) malloc(sizeof(int) * groesse);  
    if (zahlen == NULL) {  
       // Was passiert, wenn kein Speicher angefordert werden kann?  
    }  
    else {  
       // *zahlen zeigt nun auf einen Speicherbereich, der 5 ints gross ist.  
    }  
    
    

    Solche dynamischen Speicherbereiche kann (und sollte) mann auch wieder freigeben, wenn man sie nicht mehr braucht:

      
    free (zahlen);  
    
    

    Es ist auch möglich, sich nochmal Speicher "nachzuholen":

      
    int neueGroesse = 25;  
    int *neueŹahlen = (int *) realloc (zahlen, sizeof(int) * neueGroesse);  
    if (neueZahlen != NULL) {  
       // Auch das kann schief gehen, was tun wir dann?  
    }  
    else {  
       // Weiter im Text...  
    }  
    
    

    (Intern wird dabei zuerst ein Malloc ausgeführt, d.h. ein neuer Speicherbereich angefordert und dann der alte Speicherbereich in den neuen kopiert und zum Schluss der alte Speicher frei gegeben. Das ist relativ "teuer", deshalb sollte man reallocs nicht jedesmal aufrufen, wenn man ein Element mehr im Array braucht, sondern das Array dann immer gleich um mehrere Elemente größer machen).

    PHP (u.ä) machen intern letztendlich auch nichts anderes, in C musst Du Dich da (leider) noch selber drum kümmern.

    Mehr dazu findest Du hier.

    Hope that helps.

    Viele Grüße,
    Jörg

    1. Sorry,
      Hier

      if (neueZahlen != NULL) {
         // Auch das kann schief gehen, was tun wir dann?
      }

      war noch ein Fehler drin, es muss natürlich heissen:

      if (neueZahlen == NULL) {
      ...
      }

    2. Hallo,

      Durch Definition eines klassisches Array in C, also etwas wie:

      int zahlen[7];

      wird Speicher auf dem Stack reserviert

      sofern diese Deklaration im lokalen Scope einer Funktion steht. Global deklarierte Variablen landen dagegen im Datensegment des Programms, und ihr Platz wird schon zur Compile-Zeit reserviert. Aber auch die haben dann eine fixe Größe, weswegen die weiteren Ausführungen genauso gelten.

      Ciao,
       Martin

      --
      Ein Theoretiker ist ein Mensch, der praktisch nur denkt.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    3. Hope that helps.

      Hi Jörg,

      danke für die ausführliche Erklärung und die Links.

      Roland