2016-04-26 42 views
-1

私は、次のコードを持っている:機能のポインタを返さないと、セグメンテーションフォルト(コアダンプ)が発生するのはなぜですか?

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; 
} 

私の質問は、なぜ私は、コードの最初の部分でセグメンテーションフォールトを取得していますか?私は関数にポインタを渡すと、そのコードブロックのアドレスが渡されたので、関数内で何をしてもポインタが指しているものに影響を与えると私は考えました。

+0

Cはポインタを値渡しするためです。 add_tree_nodes(root、tree_nodes、8)を呼び出した後、 'main()'の 'root'ポインタは変更されません。 –

+0

@SteveSummitなぜ変更されていないのですか?つまり、ループが終了しても常にNULLになるということですか? – lmiguelvargasf

+0

はい。答えを見てください。 'tree_node * root = NULLの後; root = add_tree_nodes(root、tree_nodes、8); '、ルートはまだNULLです。 –

答えて

3

add_tree_nodesrootポインタのコピーを渡しています。おそらく、あなたはadd_tree_nodesにメモリを割り当てます。しかし、これはrootの値を変更しません。ダブルポインタ(**ルート)を使用し、&rootを渡す必要があります。あなたが与えた機能add_tree_nodes()のためのあなたのプロトタイプがあるコードのあなたの最初の作品で

+0

はい、私は 'add_tree_nodes()'にメモリを割り当てています。 – lmiguelvargasf

+1

そうですね、mallocから返されるポインタはローカル変数( 'node'パラメータ)に置かれますが、メインの' node'変数には決して設定されません。したがって、あなたはまだデータを印刷するときにヌルポインタを持っています。 –

0

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

お知らせ戻り値の型はvoidました。だから、このコード行は間違っている、

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

あなたはそのadd_tree_nodeを言っているのでvalue.Your第二のコードがそれを修正返します。

関連する問題