2017-09-28 6 views
0

나는 (ADT) 바이너리 쉐어 트리의 구현을 수행했는데, 나는 아들이 가진 부모의 수를 세는 기능을 수행해야했습니다. 차이는 5보다 적습니다. 프로그램이 작동하지만이 펑션 만 실패합니다.HW3.exe의 0xCF에서 처리되지 않은 예외 : 0xC0000005 : 0x00000004 액세스 위치 읽기 0x00000004

'return'(재귀 적)에서 중단 점을 얻었습니다. 사용자가 입력하는 경우 return 문에서

int difference(BSTNode *root, comperFunc cmpFn, comperFunc lesserThenFive) 
{ 
    int count = 0; 
    if (root) 
    { 
     count = 0; 
     if (root->Left && root->Right) 
     { 
      //if root->Right > root->Left 
      if (cmpFn(root->Right->key, root->Left->key) == 1) 
      { 
       if (lesserThenFive(root->Right->key, root->Left->key)) 
        count = 1; 
      } 
      //if root->Right < root->Left 
      if (cmpFn(root->Right->key, root->Left->key) == -1) 
      { 
       if (lesserThenFive(root->Left->key, root->Right->key)) 
        count = 1;  
      } 
     } 
    } 
    return difference(root->Left, cmpFn, lesserThenFive) + difference(root- >Right, cmpFn, lesserThenFive) + count;//here is the break point 

}

+3

[mcve]를 제공해주십시오. –

+1

'return difference (root-> Left, ...':'루트'가'NULL'이면'NULL' 디어 레퍼런스가 발생합니다. – BLUEPIXY

+0

@Lundin 말하기가 불가능하다는 것을 알게되었습니다 :-) – JeremyP

답변

1

당신은 널 포인터 역 참조 differenceroot가 null됩니다.

반품은 if 내부에 있어야하며 else 부분에는 부 풀릴 수있는 값을 반환해야합니다.

조금 확장하고 있습니다. 알고리즘 recursivley는 현재 root의 왼쪽과 오른쪽 노드로 difference을 호출하지만 결국 root->left 또는 root->right 중 하나는 NULL이 될 것입니다. return 문을 사용하면 왼쪽 또는 오른쪽 멤버가 NULL 인 예 : difference을 효과적으로 호출하려고 시도합니다. NULL->left. 이것은 현대적인 운영 체제에서 오류를 일으킬 것입니다.

+0

역 참조가 실수입니다 ... 차이가 있습니다 –

+0

"역 참조"라고하면 철자 오류가 아니라 '루트'가 가리키는 메모리에 액세스하는 것입니다. C에서'* root'를하면,'root'를 역 참조합니다. 'root-> left'는'(* root) .left'의 줄임말입니다. – JeremyP