mrjerk: Arrays in C

Beitrag lesen

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