중단되어 왜 세분화 오류가 발생하는지 알 수 없습니다. 재생 목록에 첫 번째 추가를 추가하면 모든 것이 정상입니다. 그런 다음 재생 목록을 인쇄 한 다음 재생 목록에 더 추가하려고하면 세그먼트 오류가 발생합니다. 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;
}
}
방금 사용자를 어떻게 생성했는지 추가했습니다. 'users_pointer'가 가리키는 사용자 연결 목록을 만들었습니다. 나는 또한 이것을'add_playlist()'와'print_account'에 전달합니다. add_playlist()를 실행 한 다음 print_account를 실행하여 add_playlist를 다시 실행하려고하면 오류가 발생합니다. –
방금 업데이트를보고 세그먼트 오류 오류를 제거했습니다. 정말 고맙습니다. –
@LearningC : 사용자 목록의 초기화를 보여주는 업데이트를 살펴본 결과 내 대답이 정확한지 확신 할 수 없습니다. 목록에 처음에는 빈 재생 목록 요소가 포함되어 있지 않다고 추측하고있었습니다 (하지만). 그래서 나는 아직도 약간 당황 스럽다. 해당 변경으로 인해 seg 오류가 제거 된 경우 포인터가 NULL (또는 초기화되지 않음)임을 나타냅니다. 그러나 이것은 사용자 요소의 초기화를 보여주는 새로운 코드와는 완전히 일치하지 않습니다. –