2013-03-12 2 views
0
   if(tmpPtr->number<tmpPtr->next_number->number) 
       { 
        int tmpV1=tmpPtr->next_number->number; 
        int tmpV2=tmpPtr->number; 
        tmpPtr->next_number->number=tmpV2; 
        tmpV2=tmpPtr->number=tmpV1; 
       } 

이것은 내가 지금까지 시도한 것으로, 매번 멤버가 추가 될 때 연결된 목록을 정렬하기로되어 있습니다. 하지만 두 번째 노드에 넣을 때 컴파일러가 충돌합니다. 중단 점은 if 문인 if(tmpPtr->number<tmpPtr->next_number->number)입니다. 나는 문제가 무엇인지 알기 위해 정말로 열심히 노력했다. 그러나 couldnt.C++ 프로그램이 연결 목록을 충돌합니까?

+2

'tmpPtr-> next_number'가'NULL'이거나 초기화되지 않았다고 생각합니다. –

+1

디버거를 사용할 때 문제가 발생한 줄은 무엇입니까? –

+0

@DavidBrown 제대로 연결되어 있지 않다고 생각합니다. 그것을 고치는 방법에 대한 제안? –

답변

2

두 번째 실행에서 tmpPtrNULL 값이 next_number 인 첫 번째 요소를 가리 킵니다. 그래서 그것을 역 참조하려고하면 기본적으로 SIGSEGV이되는 NULL 포인터로 자체가 축소됩니다.

n->number = input 
n->next_number = NULL 
h = n 
t = n 
counter2 = 1 

그래서 제 2 입력으로 시작하는 첫번째 작업 후에

n->number 
n->next_number = NULL 
tmpPtr = h // which is the previous n and therefor h->next_number = NULL 
tmpPtr->next_number == NULL // this is your problem since you do not check if next_number is a valid pointer 

UPDATE : 제 위해 https://gist.github.com/sahne/c36e835e7c7dbb855076

+0

네, 저는 또한 같은 생각을했습니다. 하지만 어떻게 고칠 수 있습니까? –

+0

그 요소에 접근하기 전에'tmpPtr-> next_number'가'NULL'이 아닌지 확인해야합니다. – dwalter

+0

btw. 'tmpPtr'을 루프 내의 다음 요소로 설정해야합니다. 그렇지 않으면 무한 루프가 발생합니다. – dwalter

1

에 용액 (hackish) 버전을 올린 경우 add, h-> next_number가 NULL이므로 내부 while 루프의 첫 번째 반복에서 NULL (h-> next_number-> number의 별칭)을 참조 해제합니다.

편집 당신이 두번째 항목을 삽입하고
:
머리 == 꼬리, 그래서 머리 -> == NULL의 다음.
내부 루프를 시작하십시오 :
head-> number == 처음 삽입 한 항목.
head-> 다음 == NULL입니다.
head-> next-> number == dereferenced NULL.

+0

어떻게 참조 해제합니까? –

+0

내 수정 된 답변보기 – EHuhtala

관련 문제