2014-12-09 4 views
1

학교의 경우 연결 목록에 팝업 기능을 구현해야합니다. 그러나 그것을 실행할 때 세분화 오류가 발생하고 이유를 알지 못합니다 ... 이미 디버깅했으며 값 = 현재 -> 다음으로 가리 킵니다. 저는 C에게 매우 익숙합니다. 그래서 이것이 바보 같은 질문이라면 유감입니다.C 세그먼트 화 오류 링크 된 목록

참고 : 팝업 옆에 훨씬 많은 기능을 구현해야했습니다. 따라서 여기서 볼 수있는 다른 모든 함수 호출은 이미 구현되어 있으며 올바로 작동합니다.

list.h

int list_pop(struct List* list, int* value); 

list.c

int list_pop(struct List* list, int* value) 
{ 
    struct ListNode* curr = list->first; 
    struct ListNode* prev; 

if (curr == NULL) 
    return 0; 

while (curr != NULL) 
{ 
    prev = curr; 
    curr = curr->next; 
} 

*value = curr->value; **Debugger says that in this line there is something wrong.** 
prev->next = NULL; 
free(curr); 
return 1; 

이 팝업 기능이 맞다면 누군가가 나에게 말할 수있는 경우 또한 아주 멋진 것, 사전에 감사합니다 :)

+1

처음에는 'current == NULL'인 경우에만 해당 줄 앞의 while 루프가 종료됩니다. 즉,'current'는 그 라인에서'NULL'을 보장합니다. 즉, 역 참조하면 안됩니다. – murgatroid99

+0

이 줄 : while (current! = NULL)은 현재가 이미 목록의 끝을 지나고 있다는 것을 의미합니다. 그러나 이전은 목록의 마지막 항목을 가리 킵니다. 그래서 전에 사용 – user3629249

답변

3
while (current != NULL) 
{ 
    previous = current; 
    current = current->next; 
} 

*value = current->value; 

while 루프가 끝날 때 현재 값은 NULL입니다.

다음 요소가있는 동안 반복하고 싶습니다. 따라서 current가 NULL 그래서이 while 루프가 종료됩니다

while (current->next != NULL) 
+0

고마워요 :) 나는 바보가 될 줄 알았어 : D 조 – Ayk96

1
while (current != NULL) 

하여 교체해야합니다. 훌륭한! 자, 다음 일은 어떻게 될 것입니까?

*value = current->value; 

글쎄, 현재 NULL이되었습니다. NULL 포인터를 역 참조하면 디버거가 매우 슬플 것이다.