2016-07-12 12 views
0

私のプログラムにセグメンテーションフォールトがあるというエラーメッセージが表示されました。私はgdbを使用してそれをトレースし、以下は私がそれを見つけた場所です。どうすれば修正できますか?Cプログラムを実行するとセグメンテーションフォルトが発生する

void add_to_hash(HashTable **h, char *data) 
{ 
int index = hash_value(data); 
HashTable *curr_table = h[strlen(data)]; 
Node * exist_node = exist(curr_table, data); 

if (exist_node == NULL) 
{ 
    Node *new_node = (Node*)malloc(sizeof(Node)); 
    if (new_node == NULL) { 
     printf("Error allocating memory for new bucket\n"); 
     exit(1); 
    } 
    if (data != NULL) 
    { 
     new_node->data = strdup(data); 
     new_node->next = curr_table->nodes[index]; 
     curr_table->nodes[index] = new_node; 
     free(data);         
    } 
} 
else { 
    return; 
} 
} 

//Rerturn the exist data. 
Node* exist(HashTable* h, char* data) 
{ 
int index = hash_value(data); 
Node* list = NULL; 
list = h->nodes[index];//gdb told me this line has error. 
if (list) { 
    for (; list != NULL; list = list->next) { 
     if (strcmp(data, list->data) == 0) { 
      return list; 
     } 
    } 
} 
return NULL; 
} 

これは、私はラインがエラーであることgdb

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400baa in exist (h=0x0, data=0x644660 "a\n") at G1.c:129 
129    list = h->nodes[index]; 
(gdb) bt 
#0 0x0000000000400baa in exist (h=0x0, data=0x644660 "a\n") at G1.c:129 
#1 0x0000000000400afa in add_to_hash (h=0x603250, data=0x644660 "a\n") at G1.c:105 
#2 0x0000000000400920 in main (argc=3, argv=0x7fffffffebf8) at G1.c:55 
+1

それはあなたがマークしたラインが問題である可能性は低いです:gdbexist関数に渡されたパラメータの値を報告しますので、我々はこれを知っています。スタックのトレースをgdbからあなたの質問に貼り付けると、細かいことがわかります。また、クラッシュを再現する小さな完全な例を作成することを検討する必要があります。 –

+0

@RetiredNinja申し訳ありません、編集しました。 – Allen

+0

'h = 0x0'。その鐘があなたのために鳴らないのですか?スタックトレースを取得することは良いスタートですが、変数値を調べることでさらにデバッグできます。コードの残りの部分(表示していないもの)に応じて修正する方法はいくつかあります。一つの方法は、 'h'が' NULL'ならすぐに 'exist'からNULLを返すことです。しかし、それは、その関数に渡されたときに 'h'がNULLであることが許されているかどうかによって正しいかもしれません。 – kaylum

答えて

1

から得たものです。 GDBはhは、(アドレス0を指して)NULLポインタであることを

0x0000000000400baa in exist (h=0x0, data=0x644660 "a\n") at G1.c:129 

であなたを語っています。 h->nodes[index]で逆参照すると、segfaultingが発生します。 HashTable *curr_table = h[strlen(data)];を設定すると、問題がadd_to_hashにある可能性があります。 h[strlen(data)]NULLになる可能性があります。そのため、curr_tablehとして最終的にexistという関数に渡します)はNULLです。

1

コール

HashTable *curr_table = h[strlen(data)]; 

に戻りNULL。

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400baa in exist (h=0x0, data=0x644660 "a\n") at G1.c:129 
          ^^^^^^ 
129    list = h->nodes[index]; 
関連する問題