2017-07-25 7 views
-2

Aus welchen Gründen treten Segmentierungsfehler auf? In dem folgenden Code versuche ich eine einfache Möglichkeit zu erstellen, verknüpfte Listen zu verwenden. Grundsätzlich in meinem Programm erstellen Sie nur eine Liste mit dem Strukturtyp LinkedList. Es gibt jedoch eine Zeile im Programm, die einen Segmentierungsfehler verursacht. Warum passiert das? Jede Hilfe würde sehr geschätzt werden. Danke :)Warum tritt ein Segmentierungsfehler auf?

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

struct node{ 
    int num; 
    struct node *next; 
}; 
//Make the struct 

typedef struct { 
    struct node * first; 
    struct node * current; 
}linkedList; 

void addNode(linkedList list, int a); 
void addFirstNode(linkedList list, int b); 
//Function prototypes 

int main() { 

    linkedList list; 
    addFirstNode(list, 1); 
    addNode(list, 2); 
    addNode(list, 3); 
    addNode(list, 4); 
    addNode(list, 5); 
    addNode(list, 6); 
    addNode(list, 7); 
} 

void addFirstNode(linkedList list, int input) { 

    list.first = (struct node *)malloc(sizeof(struct node)); //Make first node 
    list.first -> num = input;         //Fill first node 
    list.current = list.first;          
} 
void addNode(linkedList list, int input) { 

    struct node * newNode = (struct node *)malloc(sizeof(struct node)); 
    newNode -> num = input;      
    list.current -> next = newNode; //Segmentation fault! (core dumped) 
    list.current = newNode; 
} 
+1

, die die Codezeile, die Segmentierungsfehler verursacht? – satheeshwaran

+1

C hat kein Konzept eines Segmantierungsfehlers. Undefiniertes Verhalten verhält sich - definitionsgemäß - nicht definiert. Wir sind kein Debugging-Dienst, lesen Sie [ask]. Genau das: Ihre Funktionsschnittstellen sind kaputt. C ist streng pass-by-value. – Olaf

+0

[Nicht das Ergebnis von 'malloc' in C] werfen (http://stackoverflow.com/q/605845/995714) –

Antwort

0

Wie in den Kommentaren darauf hingewiesen, es gibt mehrere Dinge in Ihrem Code zu korrigieren:

  • Sie müssen die Funktionsargumente durch Verweis übergeben (C geht Elemente nach Wert) .
  • Sie müssen initialisieren Ihre verknüpfte Liste, sonst werden Sie versuchen, einen Nullzeiger dereferenzieren.

Hier ist eine korrekte Version des Codes:

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

struct node{ 
    int num; 
    struct node *next; 
}; 
//Make the struct 

typedef struct { 
    struct node * first; 
    struct node * current; 
}linkedList; 

void addNode(linkedList* list, int a); 
void addFirstNode(linkedList* list, int b); 
//Function prototypes 

int main() { 

    linkedList *list = (struct node *)malloc(sizeof(struct node));; 
    addFirstNode(list, 1); 
    addNode(list, 2); 
    addNode(list, 3); 
    addNode(list, 4); 
    addNode(list, 5); 
    addNode(list, 6); 
    addNode(list, 7); 
} 

void addFirstNode(linkedList* list, int input) { 

    list->first = (struct node *)malloc(sizeof(struct node)); //Make first node 
    list->first->num = input;         //Fill first node 
    list->current = list->first; 
} 
void addNode(linkedList *list, int input) { 

    struct node * newNode = (struct node *)malloc(sizeof(struct node)); 
    newNode->num = input; 
    list->current->next = newNode; //Segmentation fault! (core dumped) 
    list->current = newNode; 
} 
Verwandte Themen