2016-05-15 11 views
0

Ich versuche, eine Priorität Warteschlange für "Druckaufträge", die ein Benutzer eingibt. Eine Zeichenfolge wird gefolgt von einem Leerzeichen und dann einer Zahl (0-9) als Priorität des Jobs eingegeben. Sobald "NONE" eingegeben wird, beendet das Programm die Eingabe und ich schreibe schließlich den Code, um die Jobs in der Reihenfolge ihrer Priorität auszudrucken. Der Code ist nicht annähernd fertig, verursacht aber bereits einen Segmentierungsfehler. Ich habe den Code ungefähr zwei Stunden lang angeschaut und sehe nichts falsch. Ich konnte auch keine Fragen finden, von denen ich das Problem lösen könnte. Ich nehme an, ich mache nur etwas Dummes und kann es nicht sehen.Segmentierungsfehler Hilfe für verknüpfte Liste Neuling in C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct node 
{ 
    int priority; 
    char *dataString; 
    struct node *next; 
}; 

struct node *first = NULL; 

int main(void) 
{ 

    char temporaryPriority; 
    int i = 0; 

    while(i != 1) 
    { 
     struct node *newNode = malloc(sizeof(struct node)); 

     if (newNode == NULL) 
     { 
      exit(EXIT_FAILURE); 
     } 

     scanf("%s", (newNode -> dataString)); 

     if ((strcmp((newNode -> dataString), "NONE") != 0) && (strcmp((newNode -> dataString), "none") != 0)) 

     { 
      scanf(" %c", &temporaryPriority); 

      (newNode -> priority) = temporaryPriority; 

      (newNode -> next) = first; 
      first = newNode; 
     } 
     else 
     { 
      i = 1; 
      free(newNode); 
     } 
    } 
    return 0; 
} 
+1

an Code Staring ist im allgemeinen unproduktiv. Es sieht nach zwei Stunden genauso aus wie zu Beginn. Die Verwendung eines Debuggers ist jedoch oft sehr nützlich, ebenso wie ein Werkzeug zur Speicheranalyse wie Valgrind. Das Hinzufügen von printf() - Anweisungen, um den Fortschritt des Codes zu verfolgen, hätte den Problembereich deutlich vor 2 Stunden aufgedeckt. Bitte hören Sie auf, Programme zu schreiben, bis Sie einige rudimentäre Debugging-Fähigkeiten und den Willen haben, sie selbst zu verwenden. –

+1

Im Moment sind Sie seit drei Monaten auf einem CS-Kurs. Bitte sag deinem Prof/TA, dass er seinen Studenten JETZT die Fehlersuche und das Debugging anweist, bevor es sinnlose, zeitraubende Hausaufgaben gibt. –

+0

@MartinJames Ich habe derzeit keinen Zugriff auf einen Debugger, da ich auf einem Server programmieren muss, auf dem nur GCC installiert ist. Ich habe printf-Anweisungen verwendet und Teile des Codes kommentiert, um das Problem zu lösen. Was Sie oben sehen, ist tatsächlich eine neu geschriebene Version, von der ich dachte, dass sie alle Fehler beseitigen würde, die ich nicht gesehen hatte. Ich habe noch nichts über das Debuggen gelernt und dachte darüber nach, mit gdb zu beginnen, aber ich werde auch in valgrind schauen. Danke für den Vorschlag. – Glace

Antwort

1

Bitte ändern char *dataString;-char dataString[50];, die 50 nur eine gefälschte Nummer, können Sie es nach Ihrer occation definieren.

Der Grund ist, dass Sie scanf("%s", (newNode -> dataString)); tun, aber Sie nicht Speicher für newNode -> dataString zuweisen.

Zweiter Weg: zuzuteilen Speicher für den Knoten:

struct node *newNode = malloc(sizeof(struct node)); 
newNode->dataString = malloc(sizeof(char) * 20); 

der Speicher für den Knoten:

free(newNode->dataString); 
free(newNode); 
+0

Vielen Dank, dass Sie mich darauf hingewiesen haben. Gibt es eine Möglichkeit, Speicher für DataString [] dynamisch zuzuweisen, während es sich in einem Knoten befindet? – Glace

+0

@Glace Ja, aber Sie wissen das bereits, weil Sie den Knoten selbst mallocated haben, und deshalb kann ich nicht verstehen, warum Sie fragen würden, wie Sie Speicher für DataString [] zuweisen? –

+0

.. besonders, weil Sie mindestens 3 Monate auf Ihrem CS-Kurs waren. –