2012-04-05 3 views
1

중단되어 왜 세분화 오류가 발생하는지 알 수 없습니다. 재생 목록에 첫 번째 추가를 추가하면 모든 것이 정상입니다. 그런 다음 재생 목록을 인쇄 한 다음 재생 목록에 더 추가하려고하면 세그먼트 오류가 발생합니다. gdb가 여기오류를보고하고 있습니다. 아무도 내가 문제를 찾도록 도와 줄 수 있습니까? 인쇄 기능이 링크 목록을 수정합니까?이 세분화 오류에 대한 이유를 파악할 수 없습니다.

struct playlist_ { 
    int album; 
    int track_num; 
    struct playlist_ *next; 
}; 
typedef struct playlist_ playlists; 

struct users_ { 
    int user_ID; 
    struct playlist_ *playlist; 
    struct users_ *next; 
}; 
typedef struct users_ users; 

/*This is how I created the user list*/ 

fscanf(transaction_file,"%d\n",&account_number); 

     /*Checks for empty list, if true creates the first user*/ 
     if(head_users == NULL){ 
     p_users = malloc(sizeof(users)); 
     p_users -> user_ID = account_number; 
     head_users = p_users; 
     curr_users = p_users; 
     head_users -> next = NULL; 
     users_pointer = head_users; 

     /*If list is not empty create new user and puts it in front of list*/ 
     }else{ 
     p_users = malloc(sizeof(users)); 
     p_users -> user_ID = account_number; 
     curr_users = p_users; 
     curr_users -> next = head_users; 
     head_users = curr_users; 
     users_pointer = head_users; 
     } 

     /*Create an empty playlist for user and set everything to null, empty playlist*/ 
     p_playlists = malloc(sizeof(playlists)); 
     curr_playlists = p_playlists; 
     curr_playlists -> album = FALSE; 
     curr_playlists -> track_num = FALSE; 
     curr_playlists -> next = NULL; 
     curr_users -> playlist = p_playlists; 

int add_playlist(users *user_pointer,album *all_albums,int user_ID,int album_ID,int track_num){ 

    playlists *head_playlist,*tail_playlist,*curr_playlist,*p_playlist; 
    users *curr_users; 

    curr_users = user_pointer; 
    while(curr_users){ 

    /* Find this user in link list */ 
    if(curr_users -> user_ID == user_ID){ 
     curr_playlist = curr_users -> playlist; 

     /* Check if playlist is empty for this user if so, update the empty list*/ 
     if((curr_playlist -> album) == NULL && (curr_playlist -> track_num) == NULL){ 
     tail_playlist = curr_users -> playlist; 
     curr_playlist -> album = album_ID; 
     curr_playlist -> track_num = track_num; 
     curr_playlist -> next = NULL; 

     }else{ 

     /*Creates a new playlist node with the request album and track number*/ 
     p_playlist = (playlists *)malloc(sizeof(playlists)); 
     p_playlist -> album = album_ID; 
     p_playlist -> track_num = track_num; 
     p_playlist -> next = NULL; 

     /*Traverse Playlist, find the tail node*/ 
     curr_playlist = curr_users -> playlist; 
     while(curr_playlist){ 
      tail_playlist = curr_playlist; 
      curr_playlist = curr_playlist -> next; 
     } 

     /* Adds the new playlist at the end */ 
      tail_playlist -> next = p_playlist; 
     } 

    } 
    curr_users = curr_users -> next; 
    } 
    /*Updates the playlist hits for each new playlist node*/ 
    *all_albums[album_ID].playlist_hits[track_num] = *all_albums[album_ID].playlist_hits[track_num] + 1; 
} 

int print_account(album *all_albums,int account_number,users *user_pointer){ 
    users *curr_users; 
    playlists *curr_playlist; 

    int i; 
    curr_users = user_pointer; 

    /*Check playlist for each user if NULL, playlist is empty*/ 
    while (curr_users){ 
    if(curr_users -> user_ID == account_number){ 

     printf("ACCOUNT %d\n",curr_users->user_ID); 
     if(curr_users -> playlist -> album == -100 && curr_users -> playlist -> track_num == -100){ 
     printf(" EMPTY Playlist\n"); 

     }else{ 
     /*Goes through the user playlist and prints out the information*/ 
     for(curr_playlist = curr_users -> playlist; curr_playlist; curr_playlist = curr_playlist -> next){ 
      printf(" ALBUM %d: %s\n",curr_users -> playlist -> album, 
       all_albums[curr_users -> playlist -> album].tracks[curr_users -> playlist -> track_num]); 
      curr_users -> playlist = curr_users -> playlist -> next; 
     } 
     } 
    } 
     curr_users = curr_users -> next; 
    } 
} 

답변

2

가능성이 문제의 일부가 curr_users -> playlist는 "빈"재생 목록에 대한 포인터로 초기화 된 것으로 가정 할 수있다 보인다. NULL이거나 초기화되지 않은 값이있는 경우 album이 후속 문에서 검사 될 때 세그먼트 화 오류가 발생합니다. 이 코드는 사용자 목록이 처음 생성 된 방법을 보여주지 않으므로 조금 추측하고 있습니다. 사용자 목록은 초기에 다음 playlist 구성원이 NULL로 초기화되어야한다에 "빈"재생 목록 항목,이 문으로 작성되지 않은 경우

:

 if ((curr_playlist -> album) == NULL && (curr_playlist -> track_num) == NULL) 

가능성이 대신해야합니다

if (curr_playlist == NULL) 

그리고 else 부분과 비슷한 새로운 재생 목록을 (malloc을 통해) 할당해야합니다. 물론, if 블록과 else 블록이 재생 목록 구조를 할당하고 초기화하는 모듈성 문제가 있습니다.

+0

방금 ​​사용자를 어떻게 생성했는지 추가했습니다. 'users_pointer'가 가리키는 사용자 연결 목록을 만들었습니다. 나는 또한 이것을'add_playlist()'와'print_account'에 전달합니다. add_playlist()를 실행 한 다음 print_account를 실행하여 add_playlist를 다시 실행하려고하면 오류가 발생합니다. –

+0

방금 ​​업데이트를보고 세그먼트 오류 오류를 제거했습니다. 정말 고맙습니다. –

+0

@LearningC : 사용자 목록의 초기화를 보여주는 업데이트를 살펴본 결과 내 대답이 정확한지 확신 할 수 없습니다. 목록에 처음에는 빈 재생 목록 요소가 포함되어 있지 않다고 추측하고있었습니다 (하지만). 그래서 나는 아직도 약간 당황 스럽다. 해당 변경으로 인해 seg 오류가 제거 된 경우 포인터가 NULL (또는 초기화되지 않음)임을 나타냅니다. 그러나 이것은 사용자 요소의 초기화를 보여주는 새로운 코드와는 완전히 일치하지 않습니다. –

관련 문제