我目前被困在编码字典项目的这一部分。其他的我都能轻松搞定,但这里。
我的问题是,每当我通过这个特定的if语句后将字典(链表头)返回给main函数时,就会弹出一个异常。
item *deleteEntry(item *entry, item *dictionary)
{
item *cont,*temp;
int check;
check = 0;
for (cont = dictionary; cont != NULL; cont = cont->next)
{
if (!strcmp(cont->word, entry->word) && cont == dictionary)
{
dictionary = cont->next;
free(cont);
check = 1;
break;
}
//other non-problematic entry-deletion statements
}
if (!check)
return 0;
return dictionary;
}
尽管它确实在函数中正确地存储了数据(我已经通过打印进行了测试),但当返回到主函数时,它就不起作用了。
这里是我调用函数
的部分printf("nEnter word to delete entry: ");
getchar();
fgets(entry->word, WORDLIMIT, stdin);
if (dictionary[toupper(entry->word[0]) - 65] == NULL)
printf("nWord Does not exist");
else
{
cont = deleteEntry(entry, dictionary[toupper(entry->word[0]) - 65]);
if (cont)
dictionary[toupper(entry->word[0] - 65)] = cont;
else
printf("nError: Word doesn't exist in archive %d!!n", toupper(entry->word[0]));
例外是:
访问冲突读取位置0xDDDDDDDD。(即使在谷歌搜索之后,我也不知道这是什么。请开导我)
这是我在这里的第一个帖子,所以我要借此机会说谢谢你,因为这是我遇到困难时第一个去的地方:)
问题解决了!
正如我所评论的,我认为关键是dictionary[toupper(entry->word[0] - 65)]
这段代码导致访问指针数组越界。例如
entry->word[0] = 'a'
toupper(entry->word[0] - 65) = 32
但是我认为你的数组有26个元素。
必须是
dictionary[toupper(entry->word[0]) - 65]
/* this is part of your code. check comments added by me
*/
for (cont = dictionary; cont != NULL; cont = cont->next /*->next can be null*/)
{
if (!strcmp(cont->word, entry->word) && cont == dictionary)
{
dictionary = cont->next; /*if ->next above is null than boom (null->null)*/
free(cont);
check = 1;
break;
}
//other non-problematic entry-deletion statements
}
/* better use this */
cont = dictionary->next;
while(cont){
if(...){
dictionary=cont->next;
free(cont);
break; /* or return something*/
}
cont=cont->Next;
}
/*return other thing*/