C 消失的弦
这是我在这里的第一篇帖子,所以我提前感谢大家的帮助 我对信息消失有意见。该程序应该从文件中读取图书标题和图书馆ID号,创建一个链表哈希表,其中每个节点包含一个保存图书标题的图书结构,以及另一个带有图书馆ID的链表,可以在其中找到图书。此时,我正试图填充哈希表,但由于某种原因,我的标题值正在消失。文件格式如下所示: 2345,《老人与海》C 消失的弦,c,string,malloc,strdup,C,String,Malloc,Strdup,这是我在这里的第一篇帖子,所以我提前感谢大家的帮助 我对信息消失有意见。该程序应该从文件中读取图书标题和图书馆ID号,创建一个链表哈希表,其中每个节点包含一个保存图书标题的图书结构,以及另一个带有图书馆ID的链表,可以在其中找到图书。此时,我正试图填充哈希表,但由于某种原因,我的标题值正在消失。文件格式如下所示: 2345,《老人与海》 567434,哈利波特 1233,学习的艺术 等等 我有 typedef NodeStruct {void* data; NodePtr prev; NodeP
567434,哈利波特
1233,学习的艺术
等等 我有
typedef NodeStruct {void* data; NodePtr prev; NodePtr next;} NodeStruct;
typedef NodeStruct* NodePtr;
typedef ListStruct {NodePtr first; NodePtr last; NodePtr current; } ListStruct;
typedef ListStruct* ListHndl;
typedef BookStruct {char* title; ListHndl lib; } BookStruct;
typedef BookStruct* BookHndl;
FILE *fileptr;
int numlines;
int numslots;
int i;
int index;
NodePtr fillnode;
int main(int argc, char *argv[]) {
fileptr = fopen(argv[1], "r");
if (!fileptr) {
printf("Error: cannot open file\n");
return 1;
}
int *libID = malloc(sizeof(int));
printf("(main) libID: %p\n", libID);
fscanf(fileptr, "%d %d", &numlines, &numslots);
printf("(main) numlines: %d numslots: %d\n", numlines, numslots);
ListHndl *H = calloc(numslots, sizeof(ListHndl));
printf("(main) calloc iterated\n");
for (i = 0; i < numlines; i++) {
printf("*************LOOP #%d*************\n", i);
char *title = malloc(sizeof(char) * 50);
if (fscanf(fileptr, "%d%*c%*c%[^\n]", libID, title) == 0) {
printf("Error: incorrect # of keys\n");
return 1;
}
printf("(main) book: %s ID: %d\n", title, *libID);
index = hash(title, numslots);
printf("(main) index: %d\n", index);
printf("(main) hash[index]: %p\n", H[index]);
if (H[index] == NULL) {
H[index] = newList();
printf("(main_if_H_NULL) hash[index]: %p\n", H[index]);
BookHndl B = newBook(title, libID);
printf("(main_if_H_NULL) BookHndl B: %p\n", B);
insertAtFront(H[index],(void *) B);
printf("(main_if_H_NULL) H[index] title: %s ID: %d\n", ((BookHndl) H[index]->first->data)->title,
*((int *) ((BookHndl) H[index]->first->data)->lib->first->data));
}
printAll(H, numslots);
NodePtr S = searchTitle(H[index], title);
printf("(main) NodePtr S: %p\n", S);
if (S == NULL) {
BookHndl B = newBook(title, libID);
insertAtBack(H[index], (void *) B);
printf("(main_if_!S) inserted book\n");
} else {
printf("(main_if_S)\n");
ListHndl idL = ((BookHndl) S->data)->lib;
if (searchID(idL, libID) == 0) {
insertAtBack(idL, (void *) libID);
printf("(main_if_S) inserted libID\n");
}
}
free((char *) title);
free((NodePtr) S);
printAll(H, numslots);
printf("hash[%d]: %s in library # %d\n", index, title, *libID);
}
return 1;
}
这个密码坏了
BookHndl B = malloc(sizeof(BookStruct));
B = (BookHndl) L->current->data;
// ...
free(B);
这将泄漏一大块内存,然后从节点结构中释放一些内容。解决这个问题,问题可能会消失。减少英语单词的数量。。。并向我们展示了代码-这看起来像是内存泄漏或某个局部变量被破坏…
fscanf(fileptr,“%d%*c%*c%[^\n]”,libID,name)
I计算了三个“%”符号和两个参数。还有一个分号丢失了。顺便问一下,什么是LibID?它没有定义。最后:typedef被认为是有害的…另外,检查scanf函数的返回值以检测解析错误。我做了一些编辑并添加了更多的代码。我觉得我在这里遗漏了一些关于指针的简单、基本的事实,有人能发现吗?OP在你回答后改变了问题吗?就是这样!我在一些地方也有。谢谢@david.pfx
BookHndl B = malloc(sizeof(BookStruct));
B = (BookHndl) L->current->data;
// ...
free(B);