2016-04-26 59 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]); 
    } 
} 

当我运行它,我得到分割故障(核心转储)。不过,如果我改变了我的功能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("%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);',root仍然是NULL。 –

回答

3

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

+0

是的,我在'add_tree_nodes()'中分配内存。 – lmiguelvargasf

+1

正确,所以malloc返回的指针被放置到一个局部变量('node'参数)中,但是永远不会设置在main的'node'变量中。所以当你打印数据时你仍然有一个空指针。 –

0

在你的第一段代码的原型功能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返回value.Your第二码纠正它。

相关问题