1

我昨天花了几个小时在我的程序中发现了一个错误。我可以将其分解为以下内容。代码没有多大意义。但问题是,如果我不排队

BST root2 = (BST) malloc(sizeof(BST));

在函数 fillTree() 中,程序做了它应该做的事情。但是取消注释该行会导致这样的效果,即 fillTree() 中 BST root3 的数据字段从 NULL 更改为不同的值。但我不明白为什么会这样。

所以未注释我得到以下输出:

root3->data is still null!

但它应该是(行注释):

root3->data is still null!
root3->data is still null!
root3->data is still null!
root3->data is still null!

请帮我!

非常感谢!

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

typedef struct BSTTag{
  struct BSTTag* lNode;
  struct BSTTag* rNode;
  void *data;
  int (*compare)(void*, void*);
} *BST;


BST createTree(BST root) {
  if(root == NULL) {
    BST bst = (BST) malloc(sizeof(BST));
    bst->lNode = NULL;
    bst->rNode = NULL;
    bst->data = NULL;
    return bst;
  }
  return root;
}

BST fillTree(BST root, int n) {
  int i;
  BST root3 = NULL;
  // error occurrs if this line is not commented
  //BST root2 = (BST) malloc(sizeof(BST));
  for(i = n; i > 0; i--) {
    int *rd = (int *)malloc(sizeof(int));
    *rd = i;
    if(i == n) {
      root3 = createTree(NULL);
    }
    if(root3->data == NULL) {
      printf("root3->data is still null!\n");
    }
  }
  return root;
}

int main(void) {
  fillTree(NULL, 4);
}
4

1 回答 1

6

您只为指针分配空间,

BST bst = (BST) malloc(sizeof(BST));

但是你使用它就像你为结构分配空间一样,

BST createTree(BST root) {
  if(root == NULL) {
    BST bst = (BST) malloc(sizeof(BST));
    bst->lNode = NULL;
    bst->rNode = NULL;
    bst->data = NULL;
    return bst;
  }
  return root;
}

并因此写入分配的内存,调用未定义的行为。

你应该分配适当的大小,

BST bst = (BST) malloc(sizeof(*bst));
于 2013-05-25T10:58:21.250 回答