아래 제공된이 프로그램을 참조하십시오. delete_node 함수의 끝에 충돌합니다. 나에게 무슨 일이 일어나는지 알려주세요. delete_node (5) 호출이 끝날 때 충돌이 발생합니다. delete_node 호출 후 printf 문이 실행되지 않습니다.연결된 목록이있는 세그먼트 오류
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
typedef struct _list{
int data;
struct _list *next;
}list;
list* create_list(int val);
list* add_list(int val, bool ad_end);
int delete_node(int val);
void print_list(void);
list* head = NULL;
list* curr = NULL;
int main()
{
int val = 10;
list* mylist;
mylist = create_list(5);
add_list(val, true);
add_list(20, true);
add_list(30, true);
add_list(25, true);
print_list();
delete_node(5);
printf("\n I am here in main \n");
print_list();
return 0;
}
list* create_list(int val)
{
list* ptr =(list*) malloc(sizeof(list));
head = curr = ptr;
ptr->data = val;
ptr->next = NULL;
return ptr;
}
list* add_list(int val, bool add_end)
{
list* ptr =(list*) malloc(sizeof(list));
ptr->data = val;
ptr->next = NULL;
if(add_end) {
curr->next = ptr;
curr = ptr;
} else {
ptr->next = head;
head = ptr;
}
return ptr;
}
int delete_node(int val)
{
list* tmp = NULL;
list* prev;
tmp = head;
while(tmp){
if(tmp->data == val) {
printf(" Found the node to be deleted\n");
prev->next = tmp->next;
if(tmp == head) {
head = tmp->next;
}
free(tmp);
printf(" Head data is %d \t head %p\t add-nxt %p\n", head->data, head, head->next);
break;
} else {
prev = tmp;
tmp = tmp->next;
}
printf("Node to be deleted not found \n");
}
return 1;
}
void print_list(void)
{
list* tmp = head;
while(tmp != NULL) {
printf("addr %p\t addr next %p\n", tmp, tmp->next);
printf(" Data is %d \n", tmp->data);
tmp = tmp->next;
}
printf("\n");
}
당신이 디버거에서 코드를 실행하려고 했이 연결되어 이해하기가 훨씬 더 간단 할 것으로 예상 나에 의해 구현 목록 및 코드를 통해 이동? 그러면 다른 사람들에게 디버깅을 요청하는 것보다 훨씬 빨리 문제를 찾을 수 있습니다. –
'prev'는'delete_node'에서 첫 번째 요소를 제거하려고 시도 할 때 설정되지 않습니다. – BLUEPIXY
이것은 오류가 아니지만 prev-> next = tmp-> next입니다. prev가 초기화되지 않은 경우 (즉, data == val이 첫 번째 값에 대해 true 인 경우) segfaults의 소스가됩니다. – LostBoy