2016-12-22 3 views
2

안녕하세요, 내 코드에 문제가 있습니다.이 오류를 보여줍니다. "Segmentation fault : 11"여기 내 코드입니다. 10 진수로 이진 연결 목록을 변환하는 프로그램을 만들려고합니다. 에서 CC에서 연결된 목록으로 이진수로 10 진수로 변환

#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

스택 오버플로에 오신 것을 환영합니다! ['malloc()'과'C'의 패밀리의 반환 값을 왜 던지지 말아야하는지에 대한이 토론을보십시오.] (http://stackoverflow.com/q/605845/2173917). –

답변

2

에 목록을 사용하여 :

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

a 0으로 초기화되지 않습니다, 아직 루프에서 당신은 p=a;...p=p->Next을한다. 이렇게하면 정의되지 않은 메모리에 액세스하여 오류가 발생할 수 있습니다. scanf("%i", &(p->b));도 seg 오류를 일으킬 수 있습니다.

BinToEntier 또한 n을 초기화하는 것을 잊어 버립니다.

2

main() 함수의 for 루프가 세그먼테이션 오류를 일으켰습니다. 간단히 말해서 목록의 각 노드 (즉 Cellule)에 공간을 할당하지 않고 첫 번째 요소 만 할당합니다. 또한 거의 똑같이 중요하게도, 마지막 노드를 지정하면 목록 끝에 추가 할 때 오류가 발생합니다.

아래의 사용 방법으로 전환하는 것을 고려하십시오.

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; 
} 

위에서 주어진 코드는 Cellule에 대한 포인터에 대한 포인터 인 변수 tp를 사용합니다. (즉, 목록 노드) 목록에서 마지막 Cellule의 "다음"특성을 표시하도록 tp를 업데이트하고 목록 p에 새 노드를 추가 할 때이를 업데이트합니다.

+0

궁금한데, 왜 코드가'malloc()'의 결과를''(liste) 던지나요? 확실히 OP의 예를 따르는 것만으로 꼭 필요하지는 않습니까? – chux

+0

특별한 이유는 없습니다. [여기] (https://stackoverflow.com/questions/605845)에서 볼 수 있듯이 실제로 캐스팅하지 않는 것이 좋습니다. OP에서 제공 한 코드를 수정하고 싶지 않았습니다. 그러나 당신이 그것을 키웠던 이후로, 최선의 방법을 사용하도록 고쳐 주도록하십시오. – ilim

+0

5+ 다른 약점/문제가있는 OP 코드를 너무 많이 수정하고 싶지 않을 수도 있습니다. – chux

관련 문제