[C] Segmentation fault bei NULL Check

Afritus

Mitglied
Guten Tag,

vor einigen Tagen habe ich ein umfangreicheres Programm geschrieben. Dieses funktioniert auf den meisten Geräten einwandfrei, einige Geräte geben jedoch einen Segmentation fault aus (mit gdb ausgeführt). Und zwar befindet sich der Fehler in folgender Funktion in Zeile 15:
Code:
void appendFigure(struct node *head, struct node *newNode)
{

  if(head->next == NULL)
  {
    // Add to the beginning
    head->next = newNode;
  }
  else
  {
    // Add to the end
    struct node *current = head;
    while(1)
    {
      if(current->next == NULL)
      {
        current->next = newNode;
        break;
      }
      current = current->next;
    }
  }
  
}

Übergeben wird mit *head der erste Node einer Linked List. *newNode ist ein neuer Node, dessen Werte bereits eine Funktion vorher deklariert wurden. Die Funktion appendFigure soll also nichts anderes tun, als zu einer gegebenen Liste einen schon deklarierten Node hinzuzufügen (wobei der effektiv erste Node sich an zweiter Stelle befindet, der head bleibt leer). Interessant ist auch, dass bei den Geräten, bei denen es nicht klappt, die erste if-Abfrage (Zeile 4) nie erfüllt wird.

Weiß jemand vielleicht, wo das Problem liegt? Ich suche schon ewig herum, zumal es auf den meisten Computern einwandfrei funktioniert.

Mit freundlichen Grüßen,
A.
 
Hallo,

wenn der Fehler in Zeile 15 auftritt, dann ist current == NULL und er kann current->next nicht auflösen, weil current halt auf keinen gültigen Speicher-Bereich verweist. Du checkst in der Zeile ja ob das Feld next in der Struktur current NULL ist, nicht ob die Structur current selbst NULL ist.

Ansonsten wären einige weitere Angaben vielleicht ganz interessant. Wie zum Beispiel: Auf welchen Geräten funktioniert es? Welche Compiler werden da eingesetzt? Wie sieht der Backtrace aus? In welcher Iteration tritt der Null-Pointer auf?

Gruß,
Wolf
 
Hallo,

wird "next" korrekt mit NULL initialisiert, d.h. ist sichergestellt, dass "next" auch wirklich immer NULL ist, falls es noch keinen nächsten Node gibt?

Falls dort irgendein zufälliger Wert drinnensteht, dann kracht es beim zweiten Durchlauf der Schleife, weil "current" ein ungültiger Wert zugewiesen wird (Zeile 20).

Gruß
MCoder
 
Hallo,
beide Tipps von euch waren Gold wert. Mit ein paar Modifikationen und einer korrekten Initialisierung des ersten next auf NULL klappt es nun auf allen Geräten einwandfrei.
Vielen Dank an euch beide!

Grüße,
A.
 

Neue Beiträge

Zurück