C语言 为什么当我不返回函数的指针时出现分段错误(核心转储)



我有以下代码:

void add_tree_nodes(tree_node* root, int nodes[], int size);
int main()
{
  int tree_nodes[] = {3, 1, 0, 2, 8, 6, 5, 9};
  tree_node* root = NULL;
  add_tree_nodes(root, tree_nodes, 8);
  printf("%dn", root->data);
  printf("%dn", root->left->data);
  printf("%dn", root->right->data);
  return 0;
}
void add_tree_nodes(tree_node* root, int nodes[], int size)
{
  for (int i = 0; i < size; i++) {
    root = add_tree_node(root, nodes[i]);
  }
}

当我运行它时,我遇到分段错误(核心转储)。但是,如果我更改了函数add_tree_nodes()返回tree_node*它就可以正常工作:

tree_node* add_tree_nodes(tree_node* root, int nodes[], int size);
int main()
{
  int tree_nodes[] = {3, 1, 0, 2, 8, 6, 5, 9};
  tree_node* root = NULL;
  root = add_tree_nodes(root, tree_nodes, 8);
  printf("%dn", root->data);
  printf("%dn", root->left->data);
  printf("%dn", root->right->data);
  return 0;
}
tree_node* add_tree_nodes(tree_node* root, int nodes[], int size)
{
  for (int i = 0; i < size; i++) {
    root = add_tree_node(root, nodes[i]);
  }
  return root;
}

我的问题是为什么我在第一段代码中出现分段错误?我认为当我将指针传递到函数中时,该代码块的地址被传递,因此我在函数内执行的任何操作都会影响指针指向的内容。

您正在将root指针的副本传递给add_tree_nodes 。大概您在add_tree_nodes中分配内存。但这不会改变root的值。您需要使用双指针(**根),并传递&root .

在你的第一段代码中,函数add_tree_nodes()的原型是,

void add_tree_nodes(tree_node* root, int nodes[], int size);

请注意,您提供的返回类型是 void 。所以,这行代码是错误的,

 root = add_tree_node(root, nodes[i]);

因为你说add_tree_node返回一个值。您的第二个代码更正了它。

相关内容

  • 没有找到相关文章

最新更新