001
13.12.2005, 00:15 Uhr
0xdeadbeef
Gott (Operator)
|
realloc funktioniert nur mit Speicherbereichen auf dem heap, also Kram, der mit malloc alloziiert wurde. Das Array liegt auf dem Stack, da kannst du die Größe nicht nachträglich verändern. Davon ab willst du scheinbar dem Array die selbe Größe zuweisen, die es schon hat, das macht für mich jetzt wenig Sinn.
Wie dem auch sei, das läuft im Grunde so:
C++: |
Fraction *p = malloc(10 * sizeof(Fraction)); /* 10 Elemente */ Fraction *tmp; /* um eventuelle Fehler zu behandeln */
/* ... */
tmp = realloc(p, 20 * sizeof(Fraction)); /* versuche, auf 20 Elemente zu erweitern */ if(tmp == NULL) { /* Fehler */ fprintf(stderr, "Fehler bei realloc\n"); } else { /* realloc hat hingehauen */ p = tmp; /* mit p weiterarbeiten */ }
free(p); /* Speicher freigeben */
|
Für den Fall, dass das in einer Schleife laufen soll, ist ganz interessant, dass realloc mit NULL als erstem Parameter sich wie malloc verhält und free(NULL) nichts macht. Das lässt sich ganz gut ausnutzen, zum Beispiel:
C++: |
#include <stdio.h> #include <stdlib.h>
int main(void) { int *arr = NULL, *tmp; int i; size_t len;
for(len = 0; scanf("%d", &i) == 1 && i != 0; ++len) { tmp = realloc(arr, (len + 1) * sizeof(int)); if(tmp == NULL) { fprintf(stderr, "Fehler bei realloc\n"); break; }
arr = tmp; arr[len] = i; }
for(i = 0; i < len; ++i) { printf("%d ", arr[i]); } putchar('\n');
free(arr);
return 0; }
|
Wobei dieses spezielle Beispiel natürlich ein bisschen verschwenderisch ist, weil es in jedem Durchlauf ein realloc macht. Aber naja, das Prinzip sollte klar werden. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 13.12.2005 um 00:26 Uhr von 0xdeadbeef editiert. |