C初始化总线错误

时间:2014-01-27 17:24:27

标签: c bus

我正在创建一个二叉树作为学习C的小项目。以下是您需要的所有代码。

typedef struct {
  int value;
  struct Node *leftchild;
  struct Node *rightchild;
  struct Node *parent;
} Node;

typedef struct {
  Node *root;
} BinaryTree;

void newBT( BinaryTree *_bt ) {
  _bt->root = 0;
  return;
};

Node* makeNode(int _value ) {
  Node *node;
  node->value = _value;
  node->leftchild = 0;
  node->rightchild = 0;
  node->parent = 0;
  return node;
};

void insert( BinaryTree* _bt, int _value ) {
  _bt->root = makeNode(_value);
  return;
};

现在,我已经测试了我的makeNode()函数,它按预期工作,我使用遍历列表的has()函数检查它,如果找到具有给定值的节点则返回true,否则返回false。它是下面main()中第一个注释掉的行。当我将BinaryTree传递给insert()并使用指针声明相同的行时,我得到一个总线错误:10。

int main () {
  BinaryTree bt;
  newBT(&bt);
  //bt.root = makeNode(14);
  insert(&bt, 14);
  //printf("%d \n", has(&bt, 14));
  return 0;
}

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

makeNode正在写入未初始化指针指向的(未定义)地址。你没有拥有这个指向的内存,所以试图写入它会导致未定义的行为;崩溃是未定义行为的有效(通常是有用的)示例。

你需要在这里分配内存

Node* makeNode(int _value ) {
    Node *node = malloc(sizeof(*node));
    if (node == NULL) {
        return NULL;
    }
    ...

确保将此内存返回系统 - 通过调用free(node) - 从列表中删除节点时。