私のプログラムにセグメンテーションフォールトがあるというエラーメッセージが表示されました。私は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
それはあなたがマークしたラインが問題である可能性は低いです:
gdb
はexist
関数に渡されたパラメータの値を報告しますので、我々はこれを知っています。スタックのトレースをgdbからあなたの質問に貼り付けると、細かいことがわかります。また、クラッシュを再現する小さな完全な例を作成することを検討する必要があります。 –@RetiredNinja申し訳ありません、編集しました。 – Allen
'h = 0x0'。その鐘があなたのために鳴らないのですか?スタックトレースを取得することは良いスタートですが、変数値を調べることでさらにデバッグできます。コードの残りの部分(表示していないもの)に応じて修正する方法はいくつかあります。一つの方法は、 'h'が' NULL'ならすぐに 'exist'からNULLを返すことです。しかし、それは、その関数に渡されたときに 'h'がNULLであることが許されているかどうかによって正しいかもしれません。 – kaylum