为什么这个c程序无法正常运行?

时间:2014-11-24 13:59:18

标签: c pointers binary-tree

这里是C中的一些代码。基本上,它创建一个小的二叉树,然后以递归的顺序遍历它。虽然我期待' 1 2 3'但它一直给我' printf'结果' 0 0 3'。

有人对下面的代码有任何想法吗?

#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;
}

2 个答案:

答案 0 :(得分:3)

更改

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

malloc(sizeof(binary_tree))

你想要这个结构的内存,而不是这个结构的指针的内存。

并且不要施放malloc的值。这在C ++中是必需的,但您在C中进行编程,其中隐式转换正在为您执行此操作。

答案 1 :(得分:2)

我认为,你的问题是

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

root是指向binary_tree类型的指针。因此,您需要为binary_tree结构分配内存,而不是“指向结构的指针”

如果您想要更清晰的照片,可以使用binary_tree打印*binary_treesizeof()的尺寸。

您可以以健全的方式重写该分配语句

 binary_tree *root = malloc(sizeof*root);

一些一般性建议:

  1. 在使用返回的指针之前,请务必检查malloc()是否成功。
  2. malloc() Cmain()家人的回复价值see why not to cast
  3. int main(void)的推荐签名为{{1}}。