2013-10-16 6 views
3

나는 (줄 번호를 무시하십시오) 나는 이진 트리의 다음과 같은 정의가 C에서 이진 검색 트리에서의 삽입에 문제가 : 이진 검색 트리 C

40 struct WordBT 
41 { 
42   char *term; 
43   struct WordBT *right; 
44   struct WordBT *left; 
46 }; 
47 typedef struct WordBT* WordPtrBT; 
49 WordPtrBT mainListBT; 

그리고 내 삽입 기능 :

81 int addlistBT(char *term, char *file, WordPtrBT curr){ 
86   if(curr == NULL){ 
87     WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT)); 
88     temp->term = term; 
92     curr = temp; 
94     return 1; 
95   } 
96   int test = //some test; 
97   if(test == 0){ return 0;} 
101   if(test > 0){ addlistBT(term, file, curr->left);} 
104   if(test < 0){ addlistBT(term, file, curr->right);} 
107 } 

그럼 내가

addlistBT(term, file, mainListBT); 

내가 프로그램에서 나중에 독방 감금 오류를 얻을 호출합니다. 내가 GDB로 디버깅 할 때이 내가 볼 것입니다 :

     curr = temp; 
(gdb) p temp 
$7 = (WordPtrBT) 0x60a2a0 
(gdb) p curr 
$8 = (WordPtrBT) 0x0 
(gdb) p mainListBT 
$9 = (WordPtrBT) 0x0 
(gdb) n 
93      addfileBT(file, curr->file); 
(gdb) p temp 
$10 = (WordPtrBT) 0x60a2a0 
(gdb) p curr 
$11 = (WordPtrBT) 0x60a2a0 
(gdb) p mainListBT 
$12 = (WordPtrBT) 0x0 

이제 내 문제는 그 밤은 mainListBT이 임시 포인터를 할당하는 이유 mainListBT 다음 포인터로 정의되어 있기 때문에? 감사합니다.

+1

그것의 터무니없는 수치 KepaniHalo는 그/그녀의 대답을 삭제, 그것은 바로 하나 때문에. 'addListBT()'에 by-address가 아닌'mainListBT'를 전달하고 있습니다. 결과적으로 호출자 측 포인터 변수에는 아무런 변화가 없으며 함수가 메모리를 누출하여 모욕을 외상에 추가합니다 – WhozCraig

+1

@ WhozCraig의 주석 옆에 'malloc (sizeof (WordPtrBT))'가 잘못되었습니다. 'malloc (sizeof (* temp)) '이어야합니다. – keltar

+0

대기하지만 mainListBT는 구조체에 대한 포인터로 정의되어 있으므로 포인터를 전달하지 않습니까? –

답변

1

해야 할 일 : addlistBT (용어, 파일, & mainListBT)를 사용하여 호출합니다. 는 그런 다음에 addlist 기능을 변경

81 int addlistBT(char *term, char *file, WordPtrBT *curr){ 
86   if(!(*curr)){ 
87     WordPtrBT temp = (WordPtrBT)malloc(sizeof(struct WordBT)); 
88     temp->term = term; 
92     *curr = temp; 
94     return 1; 
95   } 
96   int test = //some test; 
97   if(test == 0){ return 0;} 
101   if(test > 0){ addlistBT(term, file, &(*curr)->left);} 
104   if(test < 0){ addlistBT(term, file, &(*curr)->right);} 
107 } 

일부 포인터 마법 ...

3

프로그램에 여러 개의 버그가 있습니다.

먼저,이 등가을하고있다 :

void fn(int x) { 
    x = 1; 
} 

int main() { 
    x = 0; 
    fn(x); 
    // you expect x == 1 here, but you *should* expect 0. 
} 

당신이 foo()&x 대신 x을 통과해야하는 것처럼, 당신은 addlistBT()&mainListBT을 통과 (및 서명 변경) 할 필요가있다.

두 번째 명백한 버그는이 라인이 : 당신이 구조에 대한 공간을 할당 할 때

WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT)); 

가하는 포인터을위한 공간을 할당합니다. 그것은

WordPtrBT temp = malloc(sizeof(*temp)); 

또는

WordPtrBT temp = malloc(sizeof(struct WordBT)); 

수 (그리고해야 결코 malloc 전화의 캐스트 결과)해야한다.

+0

첫 번째'malloc()'솔루션에서'sizeof (* temp)'를 사용 했습니까? (그리고 +1) – WhozCraig

+0

괜찮 았어 내가 한 변경 사항 : 패스 & mainListBT 및 서명을 변경하십시오. 또한 malloc 줄을 malloc (sizeof (* WordPtrBT))으로 변경했는데 문제는 "오류 : 구조체 또는 공용체가 아닌 멤버의 용어 요청"입니다. malloc (sizeof (* temp))과 동일 –

+0

@WhozCraig 네, 고마워요. 답변이 업데이트되었습니다. –