C: Erweitern eines Arrays mit malloc

Lesezeit: 2 Minuten

Benutzer-Avatar
Mal Ock

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

Benutzer-Avatar
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.

Benutzer-Avatar
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:

  mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);

b) Realloc (RTM) verwenden, um es zu vergrößern

1368760cookie-checkC: Erweitern eines Arrays mit malloc

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy