私は、次のコードを持っている:機能のポインタを返さないと、セグメンテーションフォルト(コアダンプ)が発生するのはなぜですか?
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("%d\n", root->data);
printf("%d\n", root->left->data);
printf("%d\n", 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]);
}
}
そして、私はそれを実行したとき、私はセグメンテーションフォールト(コアダンプ)を取得していますが。はしかし、私はtree_node*
を返すためにadd_tree_nodes()
私の機能を変更した場合、それは正常に動作します:
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("%d\n", root->data);
printf("%d\n", root->left->data);
printf("%d\n", 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;
}
私の質問は、なぜ私は、コードの最初の部分でセグメンテーションフォールトを取得していますか?私は関数にポインタを渡すと、そのコードブロックのアドレスが渡されたので、関数内で何をしてもポインタが指しているものに影響を与えると私は考えました。
Cはポインタを値渡しするためです。 add_tree_nodes(root、tree_nodes、8)を呼び出した後、 'main()'の 'root'ポインタは変更されません。 –
@SteveSummitなぜ変更されていないのですか?つまり、ループが終了しても常にNULLになるということですか? – lmiguelvargasf
はい。答えを見てください。 'tree_node * root = NULLの後; root = add_tree_nodes(root、tree_nodes、8); '、ルートはまだNULLです。 –