2017-07-04 3 views
-3
#include<iostream> 
#include<cstdio> 
#include<cstdlib> 

using namespace std; 

struct Node { 
    int data; 
    Node* next; 
}; 

struct Node* takeInput(){ 
    struct Node* head; 
    cout<<"Enter element:"; 
    int data; 
    cin>>data; 
    while(data!=-1){ 
     struct Node* newNode=new (struct Node); 
     newNode->data=data; 
     newNode->next=NULL; 

     if(head==NULL){ 
      head=newNode; 
     } 
     else{ 
      struct Node* temp=new (struct Node); 
      while(temp->next!=NULL){ 
       temp=temp->next; 
      } 
      temp->next=newNode; 
     } 
     cout<<"Enter next element: "; 
     cin>>data; 
    } 
    return head; 
} 

void print(struct Node* head){ 


    while(head->next!=NULL){ 
     cout<<head->data<<"->"; 
     head=head->next; 
    } 
} 

int main(){ 
    struct Node* head = new (struct Node); 
    head = takeInput(); 
    print(head); 
} 

Der Segmentierungsfehler tritt auf, wenn die Funktion print() ausgeführt wird. Ohne die Ausführung der Druckfunktion läuft der Code einwandfrei. Der Code nimmt die Eingabe vom Benutzer, stürzt jedoch ab, wenn ich versuche, die verknüpfte Liste zu drucken. Ich verwende einen GCC-Compiler mit Code Blocks IDE auf einem Linux-Betriebssystem.Warum gibt mein Compiler mir einen Segmentierungsfehler, wenn ich diesen Code ausführe?

+7

Compiler Sie Fehlersegmentierung nicht geben. Es ist dein Programm, das es "gibt". –

+1

Was passiert, wenn Sie 'nullptr' an Ihre' print' Funktion übergeben? – iehrlich

+0

'while (temp-> next! = NULL) {' prüft 'next' eines neuen Knotens, dessen Mitglieder nicht initialisiert sind. Wahrscheinlich wollten Sie kurz vorher "temp = head;" markieren, anstatt einen neuen Knoten zuzuweisen. –

Antwort

1

Ihr Code ist voll von Zugriffen auf nicht initialisierten Variablen, nicht initialisierte Mitglieder dereferencing und Herstellung von Speicherlecks

if(head==NULL), wobei head eine lokale Variable ohne Initialisierer

012 ist

while(temp->next!=NULL), wo temp gerade erstellt wurde und next nie

while(head->next!=NULL) zugewiesen, wobei head ein Funktionsargument ist, die möglicherweise struct Node* head = new (struct Node); head = takeInput() Lecks NULL

ist.

struct Node* temp=new (struct Node); ... temp=temp->next Lecks.

ohne den Code zu viel zu ändern, sollten folgende Arbeiten:

struct Node* takeInput(struct Node* head) { 
    cout<<"Enter element:"; 
    int data; 
    cin>>data; 
    while(data!=-1){ 
     struct Node* newNode=new (struct Node); 
     newNode->data=data; 
     newNode->next=NULL; 

     if(head==NULL){ 
      head=newNode; 
     } 
     else{ 
      struct Node* temp=head; // start at the head 
      while(temp->next!=NULL){ 
       temp=temp->next; 
      } 
      temp->next=newNode; 
     } 
     cout<<"Enter next element: "; 
     cin>>data; 
    } 
    return head; 
} 

void print(struct Node* head){ 


    while(head!=NULL){ // test head, not it's successor 
     cout<<head->data<<"->"; 
     head=head->next; 
    } 
} 

int main(){ 
    struct Node* head = takeInput(NULL); 

    print(head); 
} 
0

struct Node* head; ist nicht initialisiert, wenn Sie if(head==NULL) überprüfen, wird es fast sicher zu false ausgewertet. Das einzige, was Sie in der else tun, ist Leckspeicher und dann geben Sie einen nicht initialisierten Zeiger zurück. Wenn Sie versuchen, es zu verwenden, segfault einfach wie es sollte.

Änderung struct Node* head;-struct Node* head=NULL; und struct Node* temp=new (struct Node);-struct Node* temp=head;

in Haupt Änderung struct Node* head = new (struct Node); zu struct Node* head = takeInput(); und erinnere mich an den Speicher freizugeben

+0

Funktioniert perfekt jetzt .. Vielen Dank! –

+1

"' if (head == NULL) 'es wird fast sicher zu false ausgewertet" - ist nicht wahr; es ist undefiniertes Verhalten und kann zu einem Absturz führen, kann komplett weg optimiert werden, vielleicht ... Ich denke es ist wert zu beachten, dass wir bei einem Ergebnis der Bewertung nichts davon annehmen können, wenn undefiniertes Verhalten vorhanden ist ... –

Verwandte Themen