まず、時間を割いてこれを読み、開いてくれてありがとう。私は基本的にこのコードで作業を終えており、セグメンテーション違反が発生していることを除いて、すべてがほぼ完璧であると信じています。これは宿題ですが、すべての作業を完了しましたが、Free() の 1 つに何かが混じっていることを知っており、それは私の Delete() 関数にあると思います。
#define TABLE_SIZE 310987 // size of the hash table
#define true 1
#define false 0
static int hash(BOOK *b);
/* Deletes a book with key (b -> isbn) from the table.
If the book is found, it is deleted from the table
and true is returned; If no book with the given isbn
exists, False is returned. *comps holds the number
of comparisons done for this deletion.
*/
void insert(NODE *table[], BOOK x, int *collisionCount){
int i = hash(&x);
NODE *temp;
temp = (NODE *) malloc(sizeof(NODE));
assert(temp != NULL);
temp -> element = x;
temp -> next = table[i];
if(table[i] != NULL) {
*collisionCount += 1;
}
table[i] = temp;
}
boolean delete (NODE *table[], BOOK *b, int *comps){
NODE *current, *previous;
int i = hash(b);
*comps = 0;
current = table[i];
while(current != NULL) {
*comps += 1;
if(strcmp(current -> element.isbn, b -> isbn) == 0) {
if(current == table[i]) {
table[i] = current -> next;
free(current -> element.title);
free(current -> element.author);
free(current -> element.publisher);
free(current);
return true;
}
else {
previous -> next = table[i] -> next;
free(current -> element.title);
free(current -> element.author);
free(current -> element.publisher);
free(current);
}
}
previous = current;
current = current -> next;
}
return false;
}
/* initializes the hash table to an empty table */
void initialize(NODE *table[]){
int i;
for(i = 0; i < TABLE_SIZE; i++) {
table[i] = NULL;
}
}
/* prints one BOOK object to the ouptut file */
void printToFile(const BOOK *b, FILE *fpout) {
fprintf(fpout, "ISBN: %s", b -> isbn);
fprintf(fpout, "ISBN: %s", b -> title);
fprintf(fpout, "ISBN: %s", b -> author);
fprintf(fpout, "ISBN: %d", b -> year);
fprintf(fpout, "ISBN: %s", b -> publisher);
}
/* frees all the memory allocated on the heap */
void freeMemory(NODE * table[]){
NODE *temp;
int i;
for(i = 0; i <= TABLE_SIZE; i++) {
while(table[i] != NULL) {
temp = table[i] -> next;
free(table[i] -> element.title);
free(table[i] -> element.author);
free(table[i] -> element.publisher);
free(table[i]);
table[i] = temp;
}
}
}
ターミナルの gdb デバッガーで実行したところ、次のようになりました。
gdb OpenHashing
(no debugging symbols found)...done.
(gdb) run OpenHashing
Starting program: OpenHashing
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a9e59c in free ()
(gdb) backtrace
0 0x00007ffff7a9e59c in free ()
1 0x0000000000401889 in freeMemory ()
2 0x00000000004012d4 in main ()
これは、2 つの数字が一致するため、free() にあることを意味すると思いますが、free() のどこでこれを読むかがわかりません。ダウンロード可能な適切なデバッガーを教えてください。ターミナルは正しい方向を示してくれましたが、free() が非常に多いため、どの行が私を混乱させているのか正確にはわかりません。
与えられた助けに感謝します。