Optimale Weg, Sie zu befreien() malloc ' ed 2D-array in C
Angenommen, ich habe ein 2-dimensionales array, das erstellt wurde, mit etwas wie dieses,
char **foo = (char **) malloc(height * sizeof(char *));
for(i = 0; i <= height; i++)
foo[i] = (char *) malloc (width * sizeof(char *));
Zuerst von allen, Ist dies auch der richtige Weg, ein array zu erstellen wie das?. Der Haken an der Sache ist, 'Höhe' und 'Breite' ist etwas, das während der Laufzeit.
Diese scheint zu funktionieren, aber welche ist die beste Strategie, um die Kostenlose 2d-array.
frei(funge) falsch klingt. Gehen durch einige andere Beiträge hier, ich denke ich werde frei haben jeder Zeile eins nach dem anderen?
Ich habe versucht, so etwas wie dieses,
for (height = 0; height < ip_ptr->funge_height; height++) {
free(funge[height]);
}
free(funge)
Diese, jedoch gibt mir eine double-free-Zeiger-Ausnahme. Das bedeutet, ich don ' T zu bewältigen haben, dieses Stück der Erinnerung?. Ich war der Eindruck, dass für jedes malloc ' ed Speicher müssen wir den Aufruf free().
Wenn die Breite konstant ist, ist es etwas, das verhindert, dass Sie tun
char **foo = (char **) calloc(height * width * sizeof(char));
?ja, er kann nicht schreiben Sie dann funge[i][j]; er hat zu schreiben funge[i*width+j];
Es gibt keine Notwendigkeit, umgewandelt den Rückgabewert
malloc
.Eigentlich sind es mehrere Dinge falsch. Erste, calloc() nimmt zwei Parameter. Zweitens, es gibt einen Zeiger auf einen Speicherblock, der genau wie malloc(), so dass es nicht das char** Sie erwartet haben. Aber auch, dein char*foo nicht sogar als tordek schlägt vor, mit foo[iwidth+j].
InformationsquelleAutor sudharsh | 2009-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da alle die 'Zeilen' sind die gleiche Größe, Sie können nur zuordnen, es in einem ritt, mit
malloc(height * width * sizeof (char *))
(es ist nicht ganz klar, ob Sie erstellen ein 2d-array vonchar
oder ein 2d-array vonchar *
). Sie können die Multiplikation zur Berechnung des entsprechenden index (D. H.foo[i][j]
wirdfoo + i * height + j
),free()
ing es ähnlich, nehmen Sie einen einzigen Anruf.InformationsquelleAutor Michiel Buddingh
In der for-Schleife für die Zuordnung, die Sie verwenden
i <= height;
statti < height;
. Also, Sie schreiben auf einen ungültigen Speicherbereich und das Verhalten des Codes wird unberechenbar.InformationsquelleAutor Ponting
Zweiten Zuteilung werden sollte:
du bist auch looping
height+1
mal beim zuordnen.Außerdem, dass diese beiden snippets scheinen mir Recht sein, so sollte der Fehler woanders sein.
Wenn das array reserviert wurde, als einen großen Teil des Speichers, dann hätten Sie zu befreien, es einfach einmal.
InformationsquelleAutor fortran
Den Mechanismus zu reservieren, ist OK (obwohl Sie sollten die Verwendung
sizeof(char)
stattsizeof(char *)
in der allocate-Schleife; Sie sind overallocating die Zeichenfolgen) angegeben, die Breite und Höhe sind Laufzeit-Werte.Den Eindruck, dass Sie anrufen sollen, free() einmal für jedes malloc() ist im Grunde richtig ist (Sachen wie calloc() und realloc() erschweren die einfache Geschichte).
Loop, gefolgt von freier sollten korrekt sein (oder, mindestens, wird der Allgemeine Mechanismus der " free the sub-arrays zuerst, dann die array von Zeigern auf sub-arrays), so müssen Sie prüfen, wo die double-free-Fehler kommt. Wir können nicht sehen, wo die
ip_ptr->funge_height
kontrolliert wurde; es ist nicht sofort offensichtlich, dassfunge
ist beschrieben durchip_ptr->funge_height
.Siehe die Antwort von "unknown @ google" - es gibt ein array bounds problem.
sizeof(char *) == sizeof(char **)
- möchten Sie vielleicht zu berücksichtigen, daß ein Fehler.Es ist eine Garantie, dass Zeiger auf Objekte sind alle von der gleichen Größe. Es ist nicht eine Garantie vom C-standard, die Zeiger auf Funktionen sind, die gleiche Größe wie Zeiger auf Objekte; POSIX bietet, die gewährleisten, statt.
Irgendwo unten der code, ich nicht ip_ptr->funge_height und ip_ptr->funge_width, um die Werte für Höhe und Breite. Also diese zwei sind die gleichen. Aber ja, die array-Grenzen, problem war ein noob Fehler.
InformationsquelleAutor Jonathan Leffler
Wenn Sie den Speicher, es sollte
i < height
als Schleifenbedingung.Beim freigeben von Speicher, Sie sollten die Iteration auf den gleichen index hat wie Sie bei der Zuteilung.
ip_ptr->funge_height
sollte die gleiche wie das originalheight
, aber es ist offensichtlich nicht so.Andere als, dass, sollte es funktionieren.
Hier ist ein weiterer Weg, der beinhaltet, dass weniger mallocs und frees.
Reservieren:
Freigeben:
danke, behoben.
InformationsquelleAutor dave4420
Zuweisung (vorausgesetzt, die Höhe > 0 und-Breite > 0)
Freigabe
InformationsquelleAutor AnT
In solchen Fällen können Sie immer verwenden, valgrind. Nur kompilieren Sie die ausführbare Datei und führen Sie es:
Valgrind finden alle Ihre Speicher-Validierungen und zeigen Sie auf die code-Zeilen eingebunden.
In deinem Fall kann es haben, finden Sie die Indizierung problem (< vs. <=) einfach.
InformationsquelleAutor eyalm
Wenn dein compiler das unterstützt, könntest du einen Zeiger auf eine variable-Länge-array, dh
Beachten Sie, dass müssen Sie derefence der Zeiger vor dem Zugriff auf die array-Elemente, wie zB
Dies hat den Vorteil, dass Sie erst zuordnen, einem einzigen, kontinuierlichen Speicherblock werden kann freigegeben ist, mit einem einzigen Aufruf fo
free()
.InformationsquelleAutor Christoph
Dieser 100% funktioniert, ohne exe crash.
InformationsquelleAutor Ruza