Anfänger: resize array
-
Hallo,
ich hab hier eine Aufgabe, mit der ich nicht klar komme. Ich soll einen Array vergrößern. Also der Funktion soll nen array, die alte und neue größe übergeben werden, und dann der zeiger auf den neuen Array zurück gegeben werden...
hab gedacht, ich hätte es gelöst, aber das programm stürzt immer ab...bin in C echt ein Anfänger...
Danke schonmal im Vorausint * resize_array ( int *array, int array_length, int new_array_length) { int *array2; if (array_length> new_array_length) return array; else {array2= (int*) malloc (sizeof(int)*new_array_length); int i; for (i=0;i<array_length;i++){ array2[i] = array[i];} } free (array); return array2;}
-
Ich denke, du suchst nach der Standard-Funktion realloc:
int *arr, *tmp; arr = malloc(10 * sizeof(int)); tmp = realloc(arr, 20 * sizeof(int)); if(tmp == NULL) { // Reallokation schlug fehl. arr bleibt gültig, zeigt auf Array alter Größe. } else { // Erfolg. arr = tmp; } free(arr);
-
archibaldschroeder schrieb:
Ich soll einen Array vergrößern.
Man kann kein Array vergrößern, entweder du hast deinen Aufgabensteller falsch zitiert oder der hat keine Ahnung.
Ein Array ist spezifiert durch eine feste Anzahl von Elementen gleichen Typs, die bei der Definition des Arrays zusammen mit deren Typ angegeben werden muss.
Dynamisch via malloc definierte Speicherbereiche kann man in ihrer Größe mit realloc verändern.
Ich nehme an, dass das free in deiner Funktion die Ursache ist, Arrays kann man ebensowenig "vergrößern" wie "freigeben".int array[100]; int *zeiger=resize_array(array,100,1000); /* knallt, da free knallt */ int intmem=malloc(100*sizeof(int)); int *zeiger=resize_array(intmem,100,1000); /* knallt nicht */
-
Danke schonmal für die schnellen Antworten ...
hilft mir aber leider noch nicht so wirklich... brauch ne erklärung in ganz kleinen Schritten, kann doch kein C
mit realloc kann ich doch nur was erweitern, was vorher mit malloc reserviert wurde?
das hilft mir bei dem übergebenen array ja dann nicht bei dem neuen array (array2) kann ich doch dann direkt mit malloch die neue arragröße festlegen, oder?@Wutz: hast natürlich recht, es soll nen neuer array erstellt werden, aber die funktion soll nun mal resize-array heißen...
und da die Funktion auch vorgegeben ist, kann da auch nur der zeiger auf den festen array übergeben werden...
-
Du brauchst kein array2.
Mach einfach array = realloc(...)Siehe auch
http://linux.die.net/man/3/realloc
-
ich denk man kann arrays nicht vergrößern?
meine funktion stürzt auch immer noch ab, wenn ich das free rausnehme...
-
archibaldschroeder schrieb:
ich denk man kann arrays nicht vergrößern?
Zumindest nicht die statischen Arrays, also die mit den eckigen Klammern definiert.
meine funktion stürzt auch immer noch ab, wenn ich das free rausnehme...
Dann zeig mal deinen Code...
-
archibaldschroeder schrieb:
ich denk man kann arrays nicht vergrößern?
Kann man auch nicht. Es gibt hier genug Dilettanten, die ungefragt wirres Zeug verbreiten.
archibaldschroeder schrieb:
meine funktion stürzt auch immer noch ab, wenn ich das free rausnehme...
Dann finde heraus, wo genau in deiner Funktion das passiert.
-
vielleicht drück ich mich ungenau aus, deshalb hier mal die Aufgabe:
Implementieren Sie in C eine Funktion int * resize_array (int * array, int array_length, int new_array_length). Die Funktion soll neuen größeren Speicher für einen Array reservieren, die Elemente aus array in diesen verschieben und zurück liefern. Dies soll nur dann geschehen, wenn new_array_length größer ist als array_length.
und hier nochmal mein ganzer Code, die main Methode ist nur zum ausprobieren:
#include <stdlib.h> int * resize_array ( int *array, int array_length, int new_array_length) { int *array2; if (array_length> new_array_length) return array; else {array2= (int*) malloc (sizeof(int)*new_array_length); int i; for (i=0;i<array_length;i++){ array2[i] = array[i];} } free (array); return array2;} main (void) { int abc [] = {1, 2, 3}; int *def; def= resize_array(*abc, 3, 5); }
-
Wutz schrieb:
archibaldschroeder schrieb:
ich denk man kann arrays nicht vergrößern?
Kann man auch nicht. Es gibt hier genug Dilettanten, die ungefragt wirres Zeug verbreiten.
Es ist nicht unüblich den mit malloc alloziierte Bereich als dynamisches Array zu bezeichnen. Ich denke, du verwirrst den archibald mehr, als du ihm hilfst.
@archibald: Nochmal: Schmeiß das array2 vollständig raus und mach ein array = realloc(...)!
-
archibaldschroeder schrieb:
die main Methode ist nur zum ausprobieren:
Wieso nur?
Das ist entscheidend. Schon mal gut, wenn du dir einen Testfall baust.
Und prompt ist der Fehler offensichtlich.
Statt *abc muss es natürlich abc heißen, also weg damit.
Dann läuft es auch, und wenn in deiner Aufgabenstellung das "Freigeben" des "alten" Arrays nicht explizit gefordert ist, lässt du free weg und fertig.
-
@archibald: Es ist zu unterscheiden, ob ihr malloc und realloc verwenden dürft, oder nicht. Man kann sich nämlich dadurch das Leben deutlich einfacher machen.
Statische und dynamische Arrays zu mischen ist nicht gerade sinnvoll, insbesondere dann, wenn das Array "vergrößert" werden soll.Ich würde in der main-Methode abc mit malloc Speicherplatz reservieren und beim resize_array() ein realloc machen. Das ist deutlich einfacher und du sparst Code.
-
Wenn du in main den Speicher mit malloc anforderst, solltest du auch wieder das free einbauen.
-
Aber nicht, wenn er realloc macht. Das free kommt dann in die main-Funktion.
-
Das ist sowieso ganz böse, wenn ein malloc und ein free auf nicht mehr auf der gleichen Programmlogikebene sind. Wie zum Beispiel hier, da das free zum malloc in einer Unterfunktion der malloc-ierenden Funktion steht. Das schreit geradezu nach Fehlern. Die der Threadersteller auch nicht ganz zufällig bekommt.
-
danke schonmal für die ganzen tipps. das problem ist, dass das ne alte klausuraufabe ist, die ich vorstellen muss...
in der klausur war nur die resize-array funktion gegeben, die nen statischen array bekommt... auch wenn das praktisch sein mag, der funktion direkt nen dynamischen array zu übergeben, ist das daher hier für mich nicht möglich
-
Das ist schlicht und einfach nicht möglich. Heute genausowenig wie irgendwann früher. Du musst etwas falsch verstanden haben. Es kann nicht sein!
-
Dann will der Lehrer entweder schauen wie du auf unlösbare Aufgabenstellungen reagierst oder er kann kein C.
Oder du hast die Aufgabenstellung falsch verstanden.
-
mist und ich dachte ich hätte es mit meiner ersten variante möglich gemacht
konnte nur kurz einsicht in die klausur nehmen, vielleicht hab ich da wirklich was falsch gemacht...
find ich aber merkwürdig, dass man einen statischen array nicht zur laufzeit in einen anderen array kopieren können soll. ich will ja gar nicht den ursprünglichen array verlängern... sondern alles in einen neuen array kopieren und den dann zurück geben...
-
Das klingt doch schon gleich ganz anders. Kopieren in ein größeres Array ist nicht vergrößern des alten Arrays. Tja, aber dummerweise kann man keine Arrays zurückgeben, also so ganz richtig hast du die Aufgabenstellung noch nicht wiedergegeben (vorausgesetzt, die Aufgabenstellung ist überhaupt richtig, wovon ich nicht mit Sicherheit ausgehen würde).