如何解决如果释放指针,则跟踪/断点陷阱,但是在其他if语句中不会发生相同的情况
我有这段代码(我把最重要的部分放在了这里):
struct card{
char face[3];
char suit[4];
};
typedef struct card Card;
struct stack{
Card cardd;
struct stack *nextPtr;
};
typedef struct stack Stack;
// prototypes:
void fill_deck(Card *deck);
void randomize_deck(Card *deck);
void make_stacks(Card *deck,Stack *stacks);
void additem(Card card,Stack **stack);
void print_stacks(Stack *stacks,Stack *basestacks);
int move_card(Stack *stacks,Stack *basestacks,unsigned int pos1,unsigned int pos2,unsigned int action);
int main(){
SetConsoleOutputCP(65001);
Card deck[52];
fill_deck(deck);
randomize_deck(deck);
Stack *stacks = calloc(10,sizeof(Stack));
make_stacks(deck,stacks);
Stack *basestacks = calloc(4,sizeof(Stack));
for(size_t i=0;i<4;++i){
basestacks[i].nextPtr = &(basestacks[i]);
}
unsigned int choice;
unsigned int pos1;
unsigned int pos2;
do{
print_stacks(stacks,basestacks);
printf("\n\nMoves available:\n");
printf("1: Moves card from a game stack to another game stack.\n");
printf("2: Moves card from a game stack to a base stack.\n");
printf("3: Moves card from a base stack to a game stack.\n\n");
printf("Insert move: ");
scanf("%u",&choice);
if (choice==1){
/*
some if for other choices
*/
}else if (choice==3){
printf("\nInsert starting stack: ");
scanf("%u",&pos1);
printf("\nInsert arrival stack: ");
scanf("%u",&pos2);
}
} while (choice!=0);
}
int move_card(Stack *stacks,unsigned int action){
--pos1;
--pos2;
unsigned int counter_elem = 0;
if(action==1){
/*
some if for other actions
*/
} else if (action==3){
Stack *prevfromPtr;
Stack *fromPtr = &(basestacks[pos1]);
Stack *toPtr = &(stacks[pos2]);
while(fromPtr->nextPtr!=NULL){
prevfromPtr = fromPtr;
fromPtr = fromPtr->nextPtr;
++counter_elem;
}
Stack *newmovingcard = calloc(1,sizeof(Stack));
newmovingcard->cardd = fromPtr->cardd;
newmovingcard->nextPtr = NULL;
if (toPtr->nextPtr!=toPtr){
while(toPtr->nextPtr!=NULL){
toPtr = toPtr->nextPtr;
}
toPtr->nextPtr = newmovingcard;
free(fromPtr); // bug breakpoint here
if (counter_elem!=0){
prevfromPtr->nextPtr = NULL;
} else {
basestacks[pos1].nextPtr = &(basestacks[pos1]);
}
return 0;
} else {
toPtr->cardd = newmovingcard->cardd;
toPtr->nextPtr = NULL;
free(fromPtr);
if (counter_elem!=0){
prevfromPtr->nextPtr = NULL;
} else {
basestacks[pos1].nextPtr = &(basestacks[pos1]);
}
return 0;
}
}
return -1;
}
如果您向下滚动到move_card
函数,则会在free(fromPtr)
行中进行注释。有我无法修复的错误。问题是,在move_card
函数中,我有3个if
做某些事情(我只写了第三个),而在前两个if
中,我做同样的事情(free(fromPtr)
),然后开始工作。我不知道为什么它在第三个if
中不起作用。
这是完整的代码(对不起,注释和printf用意大利语表示):https://wtools.io/paste-code/b2g2 要进行复制,请输入3,然后输入基本堆栈起始卡,然后输入到达游戏堆栈。
编辑: 如果我删除free(fromPtr)行,则它可以工作。但是我不明白为什么...。我不应该释放那个指针吗?
解决方法
您只需在此处复制地址:Stack *fromPtr = &(basestacks[pos1]);
那么您不需要释放^^
您只能释放通过malloc或calloc分配的内容
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。