2016-04-26 7 views
-1

Ich habe den folgenden Code:Warum erhalte ich einen Segmentierungsfehler (Core Dump), wenn ich keinen Zeiger meiner Funktion zurückgebe?

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

Und wenn ich es benutze ich erhalte Segmentation fault (core dumped). Wenn ich jedoch add_tree_nodes() meine Funktion geändert tree_node* zurück es funktioniert:

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

Meine Frage ist, warum bin ich im ersten Teil des Codes einen Segmentation fault bekommen? Ich dachte, dass, wenn ich einen Zeiger in eine Funktion übergab, die Adresse dieses Blockes des Codes übergeben wurde, also was auch immer ich innerhalb einer Funktion tue, beeinflußt das Ding, auf das der Zeiger zeigt.

+0

Weil C Zeiger durch Wert übergeben. Nach dem Aufruf von 'add_tree_nodes (root, tree_nodes, 8)' wird der 'root' Zeiger in' main() 'nicht geändert. –

+0

@SteveSummit warum wird nicht geändert? Also bedeutet es, dass es immer NULL ist, selbst nachdem die Schleife beendet ist? – lmiguelvargasf

+0

Ja. Siehe die Antworten. Nach 'tree_node * root = NULL; root = add_tree_nodes (root, tree_nodes, 8); ', root ist immer noch NULL. –

Antwort

3

Sie übergeben eine Kopie des root-Zeigers an add_tree_nodes. Vermutlich reservieren Sie Speicher in add_tree_nodes. Dies ändert jedoch nicht den Wert von root. Sie müssen einen Doppelzeiger (** root) verwenden und &root übergeben.

+0

Ja, ich reserviere Speicher in 'add_tree_nodes()'. – lmiguelvargasf

+1

Richtig, also wird der von malloc zurückgegebene Zeiger in eine lokale Variable (den 'node' -Parameter) gestellt, aber niemals in der 'node' -Variable in Ihrem Hauptverzeichnis. Sie haben also immer noch einen Nullzeiger, wenn Sie die Daten drucken. –

0

In Ihrem ersten Stück Code Ihr Prototyp für die Funktion add_tree_nodes() ist,

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

Hinweis der Rückgabetyp Sie war gab void. Also, diese Zeile Code ist falsch,

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

Weil Sie, dass add_tree_node sagen gibt ein value.Your zweiten Code korrigiert sie.

Verwandte Themen