我有以下代码:
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返回一个值。您的第二个代码更正了它。