2016-06-20 5 views
-3

セグメンテーションフォールトは "else if(head - > next == NULL){"で発生します。 ポインタに関する基本的なものが欠けているような気がします。CのLinkedList挿入メソッドでセグメンテーション違反が発生するのはなぜですか?

ここにコードがあります。

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Node{ 
    int value; 
    struct Node* next; 
}Node; 

void insert(Node* head, int value){ 
    if(head == NULL){ 
     head = (Node*)malloc(sizeof(struct Node)); 
     head -> value = value; 
     head -> next = NULL; 
    }else if(head -> next == NULL){ 
     printf("good\n"); 
     head -> next = (Node*)malloc(sizeof(struct Node)); 
     head -> next -> value = value; 
     head -> next -> next = NULL; 
    }else{ 
     insert(head -> next, value); 
    } 
} 

int main(){ 
    struct Node* head; 
    head = NULL; 
    insert(head, 3); 
    insert(head, 4); 
    printf("%d\n", head -> value); 
    return 0; 
} 
+0

Cは_methods_をサポートしていません。 C++は異なる言語です。 – Olaf

+0

そして、 'malloc'の結果をC言語でキャストしないでください。 – Olaf

+0

そのCプログラムです。私はこれをC++とタグ付けするつもりはありませんでした。 –

答えて

0

実際のセグメンテーションフォールトはないinsertで、mainで起こっています。問題は、mainでは、headを更新していないことです。これはNULLに初期化され、insertを呼び出した後はNULLのままです。 NULLある

printf("%d\n", head -> value); 

headので、あなたがセグメンテーションフォールトを取得している:あなたはprintfで間接参照しようとするとセグメンテーションフォールトが発生します。

insertは、ローカルコピーheadを更新するだけです。この変更は呼び出し元に反映されません。つまり、mainです。

あなたはinsertから印刷された「良い」を見たことがないしている理由は、insertを呼び出すときは、必ずheadためNULL値を渡しているということです。

これを修正する一般的な方法は2つあります。 1つはinsertを常に新しいリストヘッドへのポインタを返すように変更することです。次に、呼び出し元は、リストの先頭を戻り値で更新します。

head = insert(head, 3); 

他は、ヘッドポインタへのポインタを取るために、と返す前にそれを修正するために、インサートを変更することです。だからあなたの呼び出しは次のようになります。

insert(&head, 3); 

そしてinsertのプロトタイプがinsert

void insert(Node **head_ptr, int value) 

ようになり、headの呼び出し側のコピーが実行することによって更新される。

*head_ptr = head; 

どちらの解決策でも問題が解決されます。

関連する問題