SegmentationFaultSLL

Schnetze

Cadet 2nd Year
Registriert
Okt. 2021
Beiträge
20
Hallo zusammen,
Ich arbeite gerade an einem Programm, welches am Ende einer Singly linked list einen Knoten anhängen soll, falls die Value sich noch nicht in der Liste befindet. Falls es eingefügt wurde soll true falls nicht false zurückgegeben werden. Nun bekomme ich leider einen Segmentation Fault und ich weiß leider nicht, warum? Sitze nun schon etwas länger an dem Problem und konnte nichts erkennen 🙄 Kann mir ggf. jemand helfen, den Fehler zu finden?

MfG. und Danke im Voraus!
 

Anhänge

  • SegmentationFaultwo.png
    SegmentationFaultwo.png
    34,9 KB · Aufrufe: 202
Für mich sieht es so aus als ob für den Fall x nicht Element Liste der current knoten eins nach dem Ende steht und du auf Null zu operieren versuchst… aber es ist Weihnachten und der Pegel ist nicht ganz 0. 🤷 imo muß nach der Schleife current auf node gesetzt werden, nicht current >next.
 
  • Gefällt mir
Reaktionen: Schnetze
Schnetze schrieb:
Nun bekomme ich leider einen Segmentation Fault und ich weiß leider nicht, warum?
Perfekter Zeitpunkt, um die enormen Vorzüge eines Debuggers kennen zu lernen.
Ich kann gdb wärmstens empfehlen. Der hat auch Integration in grafische Umgebungen wie VS Code.
 
  • Gefällt mir
Reaktionen: Sebbi und Schnetze
@Iqra ja das stimmt... irgendwo im sonderfall liegt der segv. leider hab ich keine ahnung wie ich das anders lösen soll. Hast du vllt eine Idee?
@nullPtr Danke für den Tipp, aber ich hatte mit wsl und VS code schon schwierigkeiten gehabt, das zum laufen zu bringen😅
 
Der Fehler liegt in dieser Zeile:
C:
struct Node* node = malloc(sizeof(struct Node));
Du allokierst Speicher, setzt aber den Wert für node->next nicht. Dadurch steht dort ein zufälliger Wert, den du dann zu dereferenzieren versuchtst. Entweder setze node->next = NULL oder benutze calloc() um ausgenullten Speicher zu erhalten. Das Problem kannst du eventuell sogar schon in self->root haben.

Als Tipp: Du allokierst am Anfang der Funktion, weist aber erst später node->value zu. Halte diese immer dicht zusammen. Das spart Wiederholungen und man vergisst auch nicht das Zuweisen von Werten. Lagere diese Funktionalität sogar idealerweise in eine eigene Funktion aus.
Außerdem: In den false-Fällen gibt es kein free(). Dadurch entsteht ein Memory Leak.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Schnetze
Zurück
Oben