Malloc-Fehler: falsche Prüfsumme für befreite Objekt
Arbeite ich an der Implementierung Schwanz für eine Zuordnung. Habe ich es richtig funktioniert aber ich scheine immer einen Fehler aus frei zu zufälligen Zeiten.
Kann ich nicht sehen, es aufspüren, um ein Muster oder etwas anderes, es ist konsistent.
Zum Beispiel, wenn ich rufe mein Programm als "Schwanz -24 test.in" ich würde die die die falsche checksum error in der gleichen Zeile auf mehreren läuft. Jedoch mit verschiedenen Dateien und auch eine unterschiedliche Anzahl von Zeilen zu drucken, zurück, ich werde wieder kommen ohne Fehler.
Irgendeine Idee, wie man auf die Spur das Problem, ich habe versucht zu Debuggen Sie es für Stunden, ohne Erfolg.
Ist hier der problematische code:
Linien ist definiert als char** und war malloc als:
lines = (char**) malloc(nlines * sizeof(char *));
void insert_line(char *s, int len){
printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
if(processed > numlines -1){//clean up
free(*(lines+slot));
*(lines + slot) = NULL;
}
*(lines + slot) = (char *) malloc(len * sizeof(char));
if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
strcpy(*(lines+slot),s);
slot = ++processed % numlines;
}
- ist slot 0 oder 1 basiert? slot überschreitet nie zzeile-1, richtig?
- rechts das Modul automatisch bekommen es wieder um 0
- Dem compiler und dem debugger benutzt du? Je nachdem sind Sie in der Lage sein könnte, um etwas Hilfe bei der Fehlerbehebung Ihr problem.
- Ich würde vorschlagen, anstelle der original-malloc Zeile mit Zeilen = (char **) calloc(zzeile, sizeof(char *)); Der Vorteil von calloc ist, dass der Speicher genullt, so dass Sie beginnen mit alle NULL-Zeiger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre routine zu schreiben über den zugewiesenen line buffer.
Die Größe der Zeile als argument übergeben (z.B. "len") wohl nicht enthalten NUL-terminator. Beim Aufruf malloc kopieren der Zeile (z.B. "s") müssen Sie reservieren ein zusätzliches byte für den string-terminator:
Wenn Sie konsequent das problem reproduzieren mit bestimmten input-Parameter, sollten Sie die debug-so:
Beachten Sie, dass das problem könnte sehr gut sein, in einem ganz anderen Teil des Programms. Auch wenn es diesem frei, der den Fehler meldet, den code, überschreibt der guard-block kann überall sein.
Meine erste Frage ist, wie berechnen Sie len? Ist es nur strlen oder es bietet Platz für das \0 terminator? Ich denke, man kann ein überschwingen Ihre Zuordnung in Ihrem strcpy. Schlechtes Verhalten wird dazu neigen, passieren Sie auf word-Grenzen und erscheinen zufällig. Auch, stellen Sie sicher, dass Ihre Quell-strings sind null-terminiert. Wenn du einen Fehler gemacht auf der Seite Lesen und nicht beenden Sie. Dann strcpy vielleicht zufällig überschreiben Dinge.
Vielleicht versuchen:
In Bezug auf die Allgemeine form, würde ich auch Sie dazu ermuntern, ein paar stilistische änderungen, um die ganze Sache ein bisschen besser lesbar, einfacher zu Folgen und resistent gegen Fehler.
Zeiger-Arithmetik gültig ist und Spaß macht, aber ich denke, deine Absicht ist ein wenig klarer, wenn Sie das array in der form:
statt
Ich würde auch empfehlen Ihnen die Verwendung der weniger Statik. Es ist leicht genug, um durch Sie in einer Daten-Struktur, und geben Sie Sie herum in Ihren Accessoren und Mutatoren. Es wird viel mehr klar, wo die Handlung geschieht, verhindert, dass Sie Dinge wie:
wo Sie sich vorstellen können, scoping Probleme, die sind einfach miserabel zu Debuggen.
Tun zzeile und numlines den gleichen Wert haben?
Macht der Aufrufer insert_line sodass Raum für die nachfolgende NUL bei der übergabe der Länge der zweite parameter?
Ich bin nicht sicher, es ist verwandt, aber diese beiden Zeilen scheint mir suspekt:
Weisen Sie zunächst die Rückgabe von malloc zu
lines[slot]
und dann überprüfen Sie(lines+slot)
, wenn letztere NULL war, Sie hatte dereference einen NULL-Zeiger!Auch wenn Linien[slot] (Ihr *(Linien+slot)) ist nicht null, Sie werden Leck-Speicher, wenn Sie übertragen das Ergebnis von malloc() zu.
Ich gehe davon aus
lines
ist einchar
*Zeilen[]` und der slot ist im Rahmen der erlaubten Grenze!Stimme ich mit remo Verdacht über diese beiden Linien, aber nicht die Tangente, remo ging auf. Wir teilen sollten Kredit für das finden dieser Fehler.