2014-11-24 3 views
1

다음은 C의 코드입니다. 기본적으로 작은 바이너리 트리를 만든 다음 선주문으로 재귀 적으로 트래버스합니다. 나는 '1 2 3'을 기대하지만, 'printf'결과 '0 0 3'을 계속 유지합니다.왜이 C 프로그램을 제대로 실행할 수 없습니까?

누구든지 아래 코드에 대해 어떤 생각을 갖고 있습니까? 내가 생각

#include <stdio.h> 
#include <stdlib.h> 

typedef struct binary_tree{ 
    struct binary_tree *left; 
    struct binary_tree *right; 
    int value; 
}binary_tree; 

void init_btree(binary_tree *root); 

// traverse the tree in pre-order recursively 
void pre_order_r(const binary_tree *root){ 
    if(root == NULL){ 
    return; 
    } 
    printf("%d ", root->value); 
    pre_order_r(root->left); 
    pre_order_r(root->right); 
} 

int main() { 
    binary_tree *root = (binary_tree*)malloc(sizeof(binary_tree*));; 
    init_btree(root); 
    pre_order_r(root); 
    printf("\n"); 
} 

void init_btree(binary_tree *root){ 
    root->left = root->right = NULL; 
    root->value = 1; 
    binary_tree * p1 = (binary_tree*)malloc(sizeof(binary_tree*)); 
    p1->left = p1->right = NULL; 
    p1->value = 2; 
    binary_tree * p2 = (binary_tree*)malloc(sizeof(binary_tree*)); 
    p2->left = p2->right = NULL; 
    p2->value = 3; 

    root->left = p1; 
    root->right = p2; 
} 
+0

'(binary_tree *) malloc (sizeof (binary_tree *))'->'(binary_tree *) malloc (sizeof (binary_tree)) ' – BLUEPIXY

답변

2

, 당신의 문제는

binary_tree *root = (binary_tree*)malloc(sizeof(binary_tree*)); 

rootbinary_tree 유형에 대한 포인터입니다. 따라서 binary_tree 구조의 메모리를 할당해야합니다. "구조체에 대한 포인터"이 아닙니다.

그림이 더 선명하게 보이려면 binary_tree*binary_tree의 크기를 sizeof()을 사용하여 모두 인쇄 할 수 있습니다.

당신은

binary_tree *root = malloc(sizeof*root); 

일부 일반 조언으로 강력한 방법으로 그 할당 문을 다시 작성할 수 있습니다

  1. 항상 반환 된 포인터를 사용하기 전에 malloc()의 성공을 확인합니다.
  2. see why not to castmalloc()의 반환 값과 C의 패밀리를 입력하십시오.
  3. main()의 권장 기호는 int main(void)입니다. 이 구조체이 구조체에 대한 포인터를위한 메모리가 메모리를 원하는
+0

고마워, 그게 내 문제를 해결했다! 멍청한 나. – beanmoon

+0

전송은 문제가되지 않습니다. – BLUEPIXY

+1

@BLUEPIXY 네, 그렇지만 좋습니다는 아닙니까? –

3

변경

(binary_tree*) malloc(sizeof(binary_tree*)) 

malloc(sizeof(binary_tree)) 

에.

그리고 malloc의 값을 캐스팅하지 마십시오. 이것은 C++에서 필요하지만 C에서 암시 적 변환이 수행하는 프로그래밍입니다.

관련 문제