2014-04-15 5 views
0

나는 다음과 같은 코드를 가지고 : 함수 list_passengers 내 라인 fl.passengers-에 대한내 코드에서 세그먼트 오류가 발생 했습니까?

main() 
{ 
    struct passenger_node { 
     char *name; 
     struct passenger_node *next; 
    }; 

    struct flight { 
     char airline[MAXNAME]; 
     int number; 
     struct passenger_node *passengers; 
    }; 

    // New passengers are added to the front of the list of passengers. 
    void add_passenger(char *name, struct flight *flp) { 
      struct passenger_node n; 
      n.name = malloc(strlen(name)+1); 
      strncpy(n.name, name, strlen(name)+1); 
      n.next = flp->passengers; 
    }; 

    void list_passengers(struct flight fl) { 
     printf("%s", fl.passengers->name); 
    } 

    struct flight my_flight; 
    strcpy(my_flight.airline, "Air"); 
    my_flight.number = 111; 
    my_flight.passengers = NULL; 
    add_passenger("MMM", &my_flight); 
    list_passengers(my_flight); 
} 

내가 세그먼트 오류를 ​​얻고있다> 이름을? 아무도 왜 이것이라고 말할 수 있습니까?

+0

분명히 게시 할 코드가 귀하의 PC에있는 코드가 아닙니다. C는 함수 내에서 함수를 선언 할 수 없으므로 제시된 코드는 C 컴파일러에서 컴파일되지 않습니다. 사용중인 코드를 게시하십시오. – RedX

+0

@RedX : gcc는이 비표준 코드를 허용합니다 : http://ideone.com/OEomZQ –

+0

@sharth 명확히 해 주셔서 감사합니다. 이 (IMHO 끔찍한) gcc 확장에 대해 몰랐습니다. – RedX

답변

3

당신의 add_passengerpassengers 포인터를 업데이트하는 데 실패합니다.

void add_passenger(char *name, struct flight *flp) { 
     struct passenger_node *np = malloc(sizeof(struct passenger_ndoe)); 
     if (!np) return; 

     np->name = malloc(strlen(name)+1); 
     strncpy(np->name, name, strlen(name)+1); 
     np->next = flp->passengers; 
     flp->passengers = np; 
}; 

list_passengers도 올바르지 않습니다. 그것은 첫 번째 승객을 보여주고 빈 승객 목록을 확인하지 않습니다 : 당신은 기본적으로이 (어떤 C 컴파일러로 컴파일해야한다)이 필요

void list_passengers(struct flight fl) { 
    struct passenger_node *np; 

    for (np = fl.passengers; np != NULL; np = np->next) 
     printf("%s\n", np->name); 
} 
+0

구조체 자체가 아니라 구조체에 대한 포인터를 만드는 것이 더 나은 이유를 설명 할 수 있습니까? –

+0

@ Mat.S 함수 내부에서 선언 된 구조체 자체는 함수 내부에만 존재하기 때문에 함수가 반환하면 함수 자체가 사라지거나 액세스 할 수 없기 때문입니다. 너는 그걸 원하지 않아. –

+0

@ Mat.S 포인터가 정의 된 범위 밖의 (스택상의) 로컬 구조체에 포인터를 사용할 수 없습니다. 따라서 원래 코드에서'& n'을 사용하면 외부에서 한번 사용할 수 없습니다 'add_passenger' 함수. – lurker

0

중첩 된 함수는 C에서 허용되지 않습니다. 함수 내 main 함수를 정의했습니다.
name은 포인터이므로 메모리를 할당 할 필요가 없습니다. menmory를 할당 한 다음 액세스하여 NULL 포인터에 액세스하지 않았는지 확인하십시오. 세그먼트 화 오류가 발생합니다. 당신이 list_passengers()을 변경하는 경우

1

는 :

void list_passengers(struct flight fl) { 
    assert(fl.passengers != NULL); 
    printf("%s", fl.passengers->name); 
} 

당신은 그 fl.passengers == NULL을 볼 수, 당신은 그것을 역 참조 시도합니다. 당신은 동적으로 대한 passenger_node를 할당해야 할거야과 지역 하나를 사용할 수 없습니다

void add_passenger(char *name, struct flight *flp) { 
     struct passenger_node n; 
     n.name = malloc(strlen(name)+1); 
     strncpy(n.name, name, strlen(name)+1); 
     n.next = flp->passengers; 
     flp->passengers = ???;     //<--- UPDATE HERE 
}; 

:

+0

승객을 추가했습니다 MMM –

+1

'add_passenger()'는 빈 함수 몸체를 가지고 있으므로 아무것도하지 않습니다. –

+0

구현 추가 –

1

:

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

#define MAXNAME 100 

struct passenger_node { 
    char *name; 
    struct passenger_node *next; 
}; 

struct flight { 
    char airline[MAXNAME]; 
    int number; 
    struct passenger_node *passengers; 
}; 


// New passengers are added to the front of the list of passengers. 
void add_passenger(char *name, struct flight *flp) { 
     struct passenger_node *newpassenger ; 
     newpassenger = malloc(sizeof (struct passenger_node)); 
     newpassenger->name = malloc(strlen(name)+1); 
     strncpy(newpassenger->name, name, strlen(name)+1); 
     newpassenger->next = flp->passengers; 
     flp->passengers = newpassenger; 
}; 

void list_passengers(struct flight fl) { 
    printf("%s", fl.passengers->name); 
} 

main() 
{ 
    struct flight my_flight; 
    strcpy(my_flight.airline, "Air"); 
    my_flight.number = 111; 
    my_flight.passengers = NULL; 
    add_passenger("MMM", &my_flight); 
    add_passenger("XXX", &my_flight); 
    list_passengers(my_flight); 
} 

그러나 당신은 여전히해야 list_passengers 기능 작동. 잠시 동안 목록의 첫 번째 승객 만 인쇄됩니다.

관련 문제