我有点理解如何释放它们,但我很确定我在代码中做错了。
while( *bestFriend != NULL){
temptr = *bestFriend;
*bestFriend = (*bestFriend)->next;
free(temptr);
printf("Freed\n");
}
它使我的程序崩溃有点不确定是什么导致它。
编辑:代码的其余部分
int duckDuckBoot(jimmysFriend **bestFriend, int rounds, int howManyDucks, int numberOfFriends, int gameCounter){
int roundCounter;
int i;
jimmysFriend *temptr;
temptr = *bestFriend;
roundCounter = 0;
if(rounds != 0){
do{
for(i = 0; i < howManyDucks;){
i++;
if(i == howManyDucks){
temptr = temptr->next;
if((*bestFriend)->next == *bestFriend){
temptr = *bestFriend;
free(temptr);
*bestFriend = NULL;
printf("Game %d:\n", gameCounter);
printf("Jimmy has friends no more\n");
return 0;
}
else if(temptr->next == *bestFriend){
jimmysFriend *temptr2;
while(temptr->next->next != *bestFriend){
temptr = temptr->next;
}
temptr2 = temptr->next;
temptr->next = *bestFriend;
free(temptr2);
temptr = *bestFriend;
}
else if(temptr == *bestFriend){
jimmysFriend *temptr2;
temptr2 = *bestFriend;
while(temptr->next != *bestFriend){
temptr = temptr->next;
}
temptr->next = (*bestFriend)->next;
(*bestFriend) = (*bestFriend)->next;
free(temptr2);
}
else{
jimmysFriend* temptr2;
temptr2 = *bestFriend;
while(temptr2->next->next != temptr->next){
temptr2= temptr2->next;
}
jimmysFriend *temptr3;
temptr3 = temptr;
temptr2->next = temptr->next;
temptr = temptr->next;
temptr2 = NULL;
free(temptr3);
free(temptr2);
}
roundCounter++;
}
else{
temptr = temptr->next;
}
}
}while(roundCounter != rounds);
if(roundCounter == rounds){
char** nameList;
int listSize;
nameList = allocMemory(numberOfFriends);
listSize = dataTransfer(*bestFriend, nameList, numberOfFriends);
printf("Game %d:\n", gameCounter);
for(i = 0; i < listSize; i++){
printf("%s\n",nameList[i]);
}
for(i = 0; i < listSize; i++){
free(nameList[i]);
free(nameList);
}
while( *bestFriend != NULL){
temptr = *bestFriend;
*bestFriend = (*bestFriend)->next;
free(temptr);
printf("Freed\n");
}
}
}
return 1;
}
答案 0 :(得分:0)
当你这样做时
while( *bestFriend != NULL)
你忘了这是循环的。要释放的最后一个节点的下一个节点将是您释放的第一个节点。这会产生一个问题,因为该内存已从您的程序中释放出来。这将导致分段错误。
我的建议是没有圆形庄园中的列表,只有一个下一个指针没有填充就没有区别。
答案 1 :(得分:0)
圆形链表永远不会指向NULL
,因为它有一个或多个节点。
但是你正在做while( *bestFriend != NULL)
,这意味着你没有将给定的列表视为循环。