C 释放指针时跟踪/断点陷阱,但在其他if语句中不会发生同样的情况
我有这个代码(我把最重要的部分放在下面): 结构卡{ 炭面[3]; 半诉讼[4]; }; typedef结构卡; 结构堆栈{ 信用卡; 结构堆栈*nextPtr; }; typedef结构堆栈; //原型: 填空甲板(卡片*甲板); 作废随机化卡片组(卡片*卡片组); 空牌堆(牌*牌组,牌*牌堆); 无效附加项(卡片、堆栈**堆栈); 无效打印堆栈(堆栈*堆栈,堆栈*基本堆栈); int move_卡(堆栈*堆栈,堆栈*基本堆栈,无符号int pos1,无符号int pos2,无符号int action); int main(){ 设置控制台输出端口CP(65001); 卡片组[52]; 填充甲板(甲板); 随机化甲板(甲板); Stack*stacks=calloc(10,sizeof(Stack)); 制作_栈(甲板,栈); Stack*basestacks=calloc(4,sizeof(Stack)); for(大小i=0;inextPtr!=NULL){ prevfromPtr=fromPtr; fromPtr=fromPtr->nextPtr; ++反元素; } Stack*newmovingcard=calloc(1,sizeof(Stack)); 新建移动卡->卡片D=fromPtr->卡片D; newmovingcard->nextPtr=NULL; 如果(toPtr->nextPtr!=toPtr){ 而(toPtr->nextPtr!=NULL){ toPtr=toPtr->nextPtr; } toPtr->NEXTPTTR=新移动卡; free(fromPtr);//错误断点在这里 如果(计数器元素!=0){ prevfromPtr->nextPtr=NULL; }否则{ basestacks[pos1].nextPtr=&(basestacks[pos1]); } 返回0; }否则{ toPtr->cardd=新移动卡->cardd; toPtr->nextPtr=NULL; 免费(不含PTR); 如果(计数器元素!=0){ prevfromPtr->nextPtr=NULL; }否则{ basestacks[pos1].nextPtr=&(basestacks[pos1]); } 返回0; } } 返回-1; } 如果您向下滚动至C 释放指针时跟踪/断点陷阱,但在其他if语句中不会发生同样的情况,c,pointers,struct,linked-list,stack,C,Pointers,Struct,Linked List,Stack,我有这个代码(我把最重要的部分放在下面): 结构卡{ 炭面[3]; 半诉讼[4]; }; typedef结构卡; 结构堆栈{ 信用卡; 结构堆栈*nextPtr; }; typedef结构堆栈; //原型: 填空甲板(卡片*甲板); 作废随机化卡片组(卡片*卡片组); 空牌堆(牌*牌组,牌*牌堆); 无效附加项(卡片、堆栈**堆栈); 无效打印堆栈(堆栈*堆栈,堆栈*基本堆栈); int move_卡(堆栈*堆栈,堆栈*基本堆栈,无符号int pos1,无符号int pos2,无符号int ac
move\u card
功能,您将在free(fromPtr)
行中添加注释。有一个我无法修复的错误。问题是,在move\u card
功能中,我有3个if
做某些事情(我只放了第三个),在前两个if
中,我做同样的事情(free(fromPtr)
)并且工作。我不知道为什么它在第三个if
中不起作用
这是完整的代码(很抱歉,注释和printf是意大利语):
要复制,请输入3,然后输入基本堆栈起始卡,然后输入到达游戏堆栈
编辑:
如果我删除free行(从ptr中),它会工作。但我不明白为什么。。。。我是否应该释放该指针???您只需在此处复制地址:
Stack*fromPtr=&(basestacks[pos1])代码>
那你就不需要自由了^^
您只能释放使用malloc或calloc分配的内容您只能释放从malloc()返回的指针
。指向数组中间的指针不能是已分配的指针。不能释放数组的一部分。完成所有操作后,可以释放整个basestacks
数组。@Barmar那么如何释放所有剩余节点呢?如果我键入free(basestacks),我只释放每个堆栈的前10个节点。如何释放链接到前10个节点的节点?这就是我要做的。您的设计使这变得很困难,因为您将堆栈数组与堆栈的动态链接列表混合在一起,有时next
指针指向新分配的对象,有时它指向数组的元素。
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, Stack *basestacks, unsigned int pos1, unsigned int pos2, 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;
}