2016-12-22 4 views
2

Hallo Ich habe ein Problem mit meinem Code zeigt es diesen Fehler: "Segmentation fault: 11" hier ist mein Code Ich versuche, ein Programm zu machen, binäre verkettete Liste in Dezimal konvertieren unter Verwendung von Listen in Ckonvertieren binär in dezimal mit verkettete Liste in C

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

typedef struct cellule{ 
    int b; 
    struct cellule* Next; 
}Cellule; 

typedef Cellule* liste; 

int BinToEntier(liste a){ 
    int n; 
    int j=0; 
    liste p=NULL; 
    for (p=a; p->Next!=NULL; p=p->Next) { 
     n+=(p->b)*pow(2,j); 
     j++; 
    } 
    return n; 
} 

int main() { 
    liste a=NULL; 
    liste p; 
    a= (liste) malloc(sizeof(Cellule)); 
    p=a; 
    for (int i = 0; i < 4; i++) { 
    puts("enter b"); 
    scanf("%i", &(p->b)); 
    p=p->Next; 
    } 
    printf("%i\n", BinToEntier(a)); 
    return 0; 
} 
+1

Willkommen bei Stack Overflow! [Bitte lesen Sie die Diskussion darüber, warum der Rückgabewert von 'malloc()' und die Familie in 'C' nicht umgewandelt werden soll.] (Http://stackoverflow.com/q/605845/2173917). –

Antwort

2

in:

a= (liste) malloc(sizeof(Cellule)); 

a nicht auf Null initialisiert, noch in der Schleife haben Sie eine p=a;...p=p->Next. Dies wird auf undefinierten Speicher zugreifen und möglicherweise einen Segeldruck verursachen. (Beachten Sie, dass scanf("%i", &(p->b)); auch den Seg-Fehler verursachen kann.)

Auch in BinToEntier vergessen Sie zu initialisieren n.

2

Ihre for-Schleife in der Funktion main() verursacht den Segmentierungsfehler. Einfach gesagt, Sie vergeben keinen Speicherplatz für jeden Knoten (d. H. Cellule) der Liste, sondern ordnen nur das erste Element zu. Außerdem, aber fast genauso wichtig, ist Ihre Zuordnung des letzten Knotens, den Sie an den Endpunkt der Liste anhängen, falsch.

Überlegen Sie zu dieser Verwendung, die unten angegeben ist.

int main() { 
    liste p=NULL; 
    liste *tp = &p; 
    for (int i = 0; i < 4; i++) { 
     *tp = malloc(sizeof(Cellule)); 
     puts("enter b"); 
     scanf("%i", &((*tp)->b)); 
     *tp=&((*tp)->Next); 
    } 
    *tp = NULL; 
    printf("%i\n", BinToEntier(p)); 
    return 0; 
} 

Der oben angegebene Code verwendet eine Variable tp, die ein Zeiger auf einen Zeiger auf eine Zelle ist. (d. h. Listenknoten) Tatsächlich aktualisieren wir tp, um das "Next" -Attribut der letzten Zelle in der Liste anzuzeigen, und aktualisieren es, wenn wir der Liste p neue Knoten hinzufügen.

+0

Neugierig, warum code cast '(liste)' das Ergebnis von 'malloc()'? Es ist sicherlich nicht erforderlich, nur nach OP-Beispiel? – chux

+0

Keine besonderen Gründe. Es ist eigentlich besser, es nicht zu werfen, wie man [hier] sehen kann (https://stackoverflow.com/questions/605845). Ich wollte den Code von OP einfach nicht ändern. Aber seit du es angesprochen hast, lass es mich reparieren, um die Best Practice zu verwenden. – ilim

+0

Kann sicherlich verstehen, nicht zu viel von OPs Code zu beheben, der 5+ andere Schwächen/Probleme hat. – chux