GDB错误我不认识:“程序接收信号EXC_BAD_ACCESS”

时间:2012-03-15 21:05:49

标签: c tree gdb binary-tree

我的代码处理二进制搜索树,因此这些是我在代码中引用的结构。但是在运行我的任何代码之前,gdb似乎崩溃了。

/* my own recursive function, counts number of nodes in tree */
int count_nodes(bst_node_t *node)
{
  if( node == NULL )
    return 0;
  /* if this is a leaf, return 1 */
  if( node->left == NULL && node->right == NULL )
    return 1;
  /* if left side empty, return 1 + count for right subtree */ 
  else if( node->left == NULL )
    return 1 + count_nodes(node->right);
  /* if right side empty, return 1 + count for left subtree */
  else if( node->right == NULL )
    return 1 + count_nodes(node->left);
  /* otherwise, return 1 + count for both left and right subtrees */ 
  else
    return 1 + count_nodes(node->left) + count_nodes(node->right);
}

/* mallocs the header for the BST, initializes it, and returns pointer to it */
bst_t *bst_create (void)
{
  bst_t *tree = (bst_t *)malloc(sizeof(bst_t));
  tree->root = NULL;
  tree->tree_size = 0;
  tree->num_recent_key_comparisons = 0;
}

int main(void) 
{
  bst_t *tree = bst_create();
  printf("size = %d, comparisons = %d\n", tree->tree_size, tree->num_recent_key_comparisons);
  printf("size from count_nodes = %d\n", count_nodes(tree->root));
  free(tree);
}

在gdb中运行此命令会导致以下崩溃:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x000000000000000c
0x0000000100000cc8 in main ()

如果我只是运行代码,它会通过main()中的第一个print语句,但是在调用count_nodes时崩溃,所以我认为这是一个奇怪的指针错误,但是gdb没有指出任何一行代码,它给了e错误,没有打印任何东西,这让我觉得它没有在代码中走得太远。

P.S。我只是在我的mac上安装了gdb和MAKE,从苹果的开发者网站下载了Xcode。所以我的安装方式可能有些错误。

3 个答案:

答案 0 :(得分:2)

您没有从tree返回bst_create()。您的程序导致未定义的行为 - 任何事情都可能发生你应该发一些警告。

编辑抛开:不要在{C>程序中强制转换malloc()的返回值。

答案 1 :(得分:1)

bst_t *bst_create (void)
{
  bst_t *tree = (bst_t *)malloc(sizeof(bst_t));
  tree->root = NULL;
  tree->tree_size = 0;
  tree->num_recent_key_comparisons = 0;
}

可以更好地使用

return tree;

答案 2 :(得分:1)

您忘记在bst_create

中返回该节点
bst_t *bst_create (void)
{
  bst_t *tree = (bst_t *)malloc(sizeof(bst_t));
  tree->root = NULL;
  tree->tree_size = 0;
  tree->num_recent_key_comparisons = 0;
  return tree;
}