2013-02-17 4 views
0

이것은 학교 과제물입니다. BST에 새 노드를 추가하려고하면 seg 오류가 발생합니다. 어떻게 메모리를 할당했는지와 관련이 있을지 모르지만 문제를 해결하는 방법을 알 수는 없습니다.문자열의 BST에 노드 추가

구조체 코드 : 기능을 테스트하기 위해

Tnode* add_tnode(Tnode* current_tnode, char* value) { 
    if (current_tnode == NULL) { 
    malloc(sizeof(Tnode)); 
    current_tnode->data = value; 
    current_tnode->left = NULL; 
    current_tnode->right = NULL; 
    return current_tnode; 
     } 
    else { 
    if (strcmp(current_tnode->data, value) <= 0) { 
     add_tnode(current_tnode->left, value); 
     return current_tnode->left; 
     } 
    else { 
     add_tnode(current_tnode->right, value); 
     return current_tnode->right; 
     } 
    } 
} 

메인 프로그램 :

struct tnode { 
    char* data; 
    struct tnode* left; 
    struct tnode* right; 
}; 

typedef struct tnode Tnode; 

노드 기능을 추가 내가 분할을 역 추적 할 때

int main() { 
    Tnode* new_node = (Tnode*)malloc(sizeof(Tnode)); 
    char* data1 = "Hello"; 
    char* data2 = "Goodbye"; 
    char* data3 = "Hi"; 
    char* data4 = "Bye"; 
    char* data5 = "Hey"; 

    add_tnode(new_node, data1); 
    add_tnode(new_node, data2); 
    add_tnode(new_node, data3); 
    add_tnode(new_node, data4); 
    add_tnode(new_node, data5); 

    return 0; 
}  

이것은 내가 나타나는 오류입니다 오류 :

#0 0x0000003458478350 in strcmp() from /lib64/libc.so.6 
#1 0x00000000004005be in add_tnode (current_tnode=0x601010, 
    value=0x400708 "Hello") at tree.c:16 
#2 0x0000000000400523 in main() at treetest.c:12 

strcmp()가 노드에 저장된 문자열을 찾으려고 시도 할 때 찾을 수 없다고 생각합니다. 어떤 도움이나 조언을 주시면 감사하겠습니다! (add_tnode에서)

+0

디버거를 사용해 보셨습니까? –

+0

예, 그렇습니다. 나는 seg fault에 대한 backtrace를 얻었습니다. –

+0

음, 다음에 생성/변경된 데이터 구조를 확인하고 정확히 무슨 일이 일어나는지 확인하십시오. –

답변

1

선은

malloc(sizeof(Tnode)); 

은, 코드의 다음 줄은 NULL 포인터를 역 참조 것을 당신은 즉시 malloc에서 반환 값을 폐기 의미하고

current_tnode = malloc(sizeof(Tnode)); 

해야한다 seg 오류가 발생했습니다.

new_node의 멤버를 명시 적으로 또는 calloc을 사용하여 할당하여 main에 초기화해야합니다. 카 롤리 호 바스에 의해 언급 된 바와 같이 그리고, add_tnode

+0

두 번째 문제점을 해결하기 위해 제 대답을 업데이트했습니다. 나는 이것이 당신이 보았던 사람이 될 것이라고 생각합니다. (포인터가 처음 나오는 문제는 유효하지만, 현재 당신을 트립하고있는 특정 버그가 아닙니다.) – simonc

+0

알았습니다. –

1

에서 또 다른 문제가 반환 값을 사용

add_tnode 새로 할당 된 노드의 주소를 반환합니다,하지만 당신은 그것을 사용하지 않습니다. 당신이 "new_node"의 필드 "데이터"에 액세스하려고

0

,

하지만 "new_node는"데이터 값으로 초기화되지 않습니다.

current_tnode->data = value; 
current_tnode->left = NULL; 
current_tnode->right = NULL; 

행운을 빕니다 :

당신이 만약 절에서이 라인을 이동해야합니다.