2014-10-15 3 views
0

문자열을 저장하는 C로 연결된 목록을 작성하고 링크 된 목록을 검색하여 요소가 있는지 확인할 수 있습니다.C EXC_BAD_ACCESS 연결된 목록에서 크래시

if (strcmp(list->value, value) == 0) return true; 

EXC_BAD_ACCESS 오류가이 목록을 액세스하기 때문이다 : 어떤 이유로, 나는 6,000 요소를 포함하는 연결리스트에 다음 코드를 실행할 때마다 2 ~ 3 회, 나는 다음 줄에 EXC_BAD_ACCESS 오류 -> 값. 나는 왜 내가 LINE_BUFFER보다 큰 문자열을 가질 수 없기 때문에 이것이 왜 될 수 있는지 이해하지 못하고 값 포인터를 설정하기 전에 힙에 메모리를 할당한다. 그 기억은 절대로 할당 취소해서는 안된다는 뜻인가요?

내 라인 버퍼 선언 :

여기
struct Node { 
    struct Node *next; 
    char *value; 
}; 
typedef struct Node Node; 

링크 된 목록 코드입니다 :

여기
#define LINE_BUFFER 81 

링크 된 목록 Node 구조체의 당신이 node->next를 초기화 결코

Node * create_node(Node *list, char *value) { 

    Node *node = malloc(sizeof(Node)); 
    node->value = strcpy(malloc(sizeof(char) * LINE_BUFFER), value); // make sure value is on the heap 

    // find the end of the list 
    Node *end = NULL; 
    while (list) { 

     end = list; 
     list = list->next; 

    } 

    // add this node to the end if necessary 
    if (end) { 

     end->next = node; 

    } 

    return node; 

} 

Node * init_list(char *value) { 

    Node *node = create_node(NULL, value); 
    return node; 

} 

Node * add_list(Node *list, char *value) { 

    Node *node = create_node(list, value); 
    return node; 

} 

bool search_list(Node *list, char *value) { 

    while (list) { 

     if (strcmp(list->value, value) == 0) return true; 
     list = list->next; 

    } 
    return false; 

} 

void free_list(Node *list) { 

    if (!list) return; 

    Node *next = list->next; 
    free(list->value); 
    free(list); 
    free_list(next); 

} 
+1

C 프로그래밍의 모든 과정에서 이와 같은 strcpy()의 반환 값에 의존하는 코드를 처음 보았을 때가 처음입니다. 그게 좋은 징조인지 확실하지 않은지 ... 말하기에 충분 : 그것은 나를 멈추게하고 생각하게했다. :) – unwind

답변

3

이 나타납니다 ~ NULL ~ create_node. 따라서 목록을 걷는 것은 초기화되지 않은 메모리를 참조 해제하고 결국 잘못된 포인터가 포함되어있을 때 충돌합니다.

+0

아름다움 - 고쳐 줬던 것처럼 보인다, 고마워! :) –

관련 문제