C언어 연결리스트에 대한 질문입니다

연결 리스트를 공부하는데, 중복되는 내용의 노드를 삭제하는 함수를 만드는 연습문제를 풀었습니다.

그런데 에러가 발생하더라구요.

제가 작성한 코드는 아래와 같습니다.

노드는 Member x, NODE * next로 구성돼있고, Member x는 int no, char name[20] 으로 구성돼있습니다.

void Purge(List* list, int compare(const Member* x, const Member* y))
{
	NODE* ptr;
	NODE* cmp;
	NODE* pre;

	if (list->head != NULL) {
		if (list->head->next == NULL)
			printf("노드가 한개 뿐입니다.");
		else {
			ptr = list->head;

			while (ptr->next != NULL) {
				cmp = ptr->next;
				pre = ptr;

				while (cmp != NULL) {
					if (compare(&ptr->data, &cmp->data) == 0) {
						pre->next = cmp->next;
						free(cmp);
						cmp = pre->next;
					}
					else {
						pre = cmp;
						cmp = cmp->next;
					}
				}
				ptr = ptr->next;
			}
			list->crnt = list->head;
			printf("중복되는 노드를 삭제했습니다. head 노드를 가리킵니다.");
		}
	}
}

몇 번을 봐도, 제 짧은 지식으로는 오류가 무엇인지 모르겠습니다. visualstudio는 NULL포인터를

역참조하고 있다고 경고를 표시하는데 이게 무슨뜻인지도 잘 모르겠습니다.

어디에 오류가 있는지, NULL포인터를 역참조하는 것이 왜 경고할만 한지에 대해 답해주셨으면 좋겠습니다.

list가 NULL이면 list->head는 NULL에 존재하는 List 의 head를 가져오라는 것이니 불가능한 일이지요

if (!list) return;
넣어주면 될 겁니다

그리고 NODE* ptr; 처럼 지역변수를 선언하고 초기화하지 않는 것은 위험천만한 행위입니다
반드시 NODE* ptr = 0; 으로 초기화해 줍시다

아하…! 친절한 답변 정말 감사드립니다!

죄송한데, 하나만 더 여쭤봐도 될까요?

지역 변수를 선언 할때,

사용하기 전에 초기화만 해주고 사용한다면 괜찮을 것이라고 생각했는데 그게 아닌가 보네요

혹시 바로 초기화를 해야하는 구체적인 이유도 말씀해주실 수 있을까요?

실제로 프로그래밍을 해본 경험이 없어서 왜 그런지 감이 잘 안잡히네요…

사용하기 전에 초기화만 해주고 사용하면 괜찮은 것이 맞습니다
그런데 그 사용하기 전에 초기화를 해 주는 것을 까먹는다는 것이 문제입니다
바로 초기화를 하는 좋은 습관만 들인다면 그걸 신경쓸 필요가 없죠

아하! 실수를 미연에 방지할 수가 있겠군요 ㅎㅎ 감사합니다!