Ich bin ein bisschen neu in Malloc und C im Allgemeinen. Ich wollte wissen, wie ich bei Bedarf die Größe eines Arrays mit ansonsten fester Größe mit malloc erweitern kann.
Beispiel:
#define SIZE 1000
struct mystruct
{
int a;
int b;
char c;
};
mystruct myarray[ SIZE ];
int myarrayMaxSize = SIZE;
....
if ( i > myarrayMaxSize )
{
// malloc another SIZE (1000) elements
myarrayMaxSize += SIZE;
}
Das obige Beispiel soll verdeutlichen, was ich erreichen möchte.
(Übrigens: Ich brauche das für einen Interpreter, den ich schreibe: Arbeite mit einer festen Anzahl von Variablen und falls mehr benötigt werden, weise sie einfach dynamisch zu.)
ich_am_jorf
Verwenden Reallok, aber Sie müssen das Array zuerst mit malloc allokieren. Sie weisen es im obigen Beispiel auf dem Stack zu.
size_t myarray_size = 1000;
mystruct* myarray = malloc(myarray_size * sizeof(mystruct));
myarray_size += 1000;
mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct));
if (myrealloced_array) {
myarray = myrealloced_array;
} else {
// deal with realloc failing because memory could not be allocated.
}
x = realloc(x, newsize) ist ein Speicherleck, das darauf wartet, passiert zu werden.
– R. Samuel Klatschko
30. April 2010 um 22:38 Uhr
Guter Punkt. Ich habe den Beispielcode aktualisiert, um Realloc-Fehler zu behandeln.
– i_am_jorf
30. April 2010 um 23:04 Uhr
myarray = myrealloced_array) sollte sein myarray = myrealloced_array; 🙂
– Saulus
30. April 2010 um 23:14 Uhr
Sie müssen nicht unbedingt mit zuweisen malloc() first – “Wenn ptr ein Nullzeiger ist, verhält sich die realloc-Funktion wie die malloc-Funktion für die angegebene Größe”
– Michael Burr
30. April 2010 um 23:26 Uhr
Programmieren ist schwer. 🙂
– i_am_jorf
12. November 2014 um 18:14 Uhr
Sie möchten realloc verwenden (wie andere Poster bereits darauf hingewiesen haben). Aber leider haben dir die anderen Poster nicht gezeigt, wie man es richtig benutzt:
POINTER *tmp_ptr = realloc(orig_ptr, new_size);
if (tmp_ptr == NULL)
{
// realloc failed, orig_ptr still valid so you can clean up
}
else
{
// Only overwrite orig_ptr once you know the call was successful
orig_ptr = tmp_ptr;
}
Sie müssen verwenden tmp_ptr also wenn realloc fehlschlägt, verlieren Sie den ursprünglichen Zeiger nicht.
Steve Jessop
Nein, das kannst du nicht. Sie können die Größe eines Arrays auf dem Stack nicht mehr ändern, wenn es einmal definiert ist: Das ist in etwa die Bedeutung von Fixed-Size. Oder ein globales Array: Aus Ihrem Codebeispiel geht nicht hervor, wo myarray ist definiert.
Sie könnten malloc B. ein Array mit 1000 Elementen, und ändern Sie später die Größe mit realloc. Dies kann Ihnen ein neues Array zurückgeben, das eine Kopie der Daten des alten enthält, jedoch mit zusätzlichem Leerzeichen am Ende.
a) Sie haben nicht malloc verwendet, um es zu erstellen, also können Sie nicht mit malloc erweitern. Tun: