C frei (): ungültiger Zeiger

8

Ich lehre mich selbst C. Mein Ziel ist es, eine C-Funktion zu erstellen, die einfach eine Abfragekette durchläuft und auf das Und-Zeichen und das Gleichheitszeichen aufteilt. Ich bleibe bei diesem Fehler von Valgrind hängen.

%Vor%

und das Backtrace:

%Vor%

endlich hier ist der Code:

%Vor%

Danke

    
user964491 30.11.2013, 06:55
quelle

3 Antworten

21

Sie versuchen, etwas freizugeben, das kein Zeiger auf eine "frei verfügbare" Speicheradresse ist. Nur weil etwas eine Adresse ist, bedeutet das nicht, dass du es tun musst oder solltest es freigeben.

Es gibt zwei Haupttypen von Speicher, die Sie zu verwirren scheinen - Stapelspeicher und Heapspeicher.

  • Stack Speicher lebt in der Live-Spanne der Funktion. Es ist temporärer Raum für Dinge, die nicht zu groß werden sollten. Wenn Sie die Funktion main aufrufen, legt sie Speicherplatz für die von Ihnen deklarierten Variablen beiseite ( p , token usw.).

  • Heap Speicher lebt von malloc bis zu free . Sie können viel mehr Heap-Speicher verwenden, als Sie Speicher stapeln können. Sie müssen es auch im Auge behalten - es ist nicht einfach wie Stapelspeicher!

Sie haben ein paar Fehler:

  • Sie versuchen, Speicher freizugeben, der kein Heap-Speicher ist. Tu das nicht.

  • Sie versuchen, das Innere eines Speicherblocks zu befreien. Wenn Sie tatsächlich einen Speicherblock zugewiesen haben, können Sie ihn nur von dem von malloc zurückgegebenen Zeiger befreien. Das heißt, nur vom Anfang des Blocks . Sie können einen Teil des Blocks nicht von innen freigeben.

Für Ihren kleinen Code hier wollen Sie wahrscheinlich einen Weg finden, den relevanten Teil des Speichers an einen anderen Ort zu kopieren ... sagen Sie einen anderen Speicherblock, den Sie beiseite gelegt haben. Oder Sie können die ursprüngliche Zeichenfolge ändern, wenn Sie möchten (Hinweis: char Wert 0 ist der Null-Terminator und teilt Funktionen wie printf, um das Lesen der Zeichenfolge zu stoppen).

BEARBEITEN: Die malloc-Funktion weist Heapspeicher * zu.

"9.9.1 Die malloc und freie Funktionen

Die C-Standardbibliothek stellt einen expliziten Zuordner bereit, der als malloc-Paket bekannt ist. Programme weisen Blöcke vom Heap zu, indem sie die malloc-Funktion aufrufen. "

~ Computersysteme: Die Perspektive eines Programmierers, 2. Ausgabe, Bryant & amp; O'Hallaron, 2011

EDIT 2: * Der C-Standard spezifiziert tatsächlich nichts über den Heap oder den Stack. Für jeden, der auf einer relevanten Desktop / Laptop-Maschine lernt, ist die Unterscheidung jedoch möglicherweise unnötig und verwirrend, besonders wenn Sie erfahren, wie Ihr Programm gespeichert und ausgeführt wird. Wenn Sie an einem AVR-Mikrocontroller wie H2CO3 arbeiten, sollten Sie unbedingt alle Unterschiede beachten, die aus eigener Erfahrung mit Embedded-Systemen weit über die Speicherzuordnung hinausreichen.

    
GraphicsMuncher 30.11.2013, 07:05
quelle
11

Woher hast du die Idee, dass du free(token) und free(tk) brauchst? Du nicht. strsep() reserviert keinen Speicher, es gibt nur Zeiger innerhalb der ursprünglichen Zeichenfolge zurück. Natürlich sind dies keine Zeiger, die von malloc() (oder ähnlich) zugewiesen werden, so dass free() in ihnen nicht definiert ist. Sie müssen nur free(s) , wenn Sie mit der gesamten Zeichenfolge fertig sind.

Beachten Sie auch, dass Sie in Ihrem Beispiel nicht die dynamische Speicherzuweisung benötigen. Sie können strdup() und free() ganz vermeiden, indem Sie einfach char *s = p; schreiben.

    
user529758 30.11.2013 07:01
quelle
3

Sie können free nicht auf den von strsep zurückgegebenen Zeigern aufrufen. Dies sind keine individuell zugewiesenen Strings, sondern nur Zeiger auf die Zeichenfolge s , die Sie bereits zugewiesen haben. Wenn du mit s fertig bist, solltest du es freigeben, aber du musst das nicht mit den Rückgabewerten von strsep machen.

    
Tim Pierce 30.11.2013 07:04
quelle

Tags und Links