Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放指针时跟踪/断点陷阱,但在其他if语句中不会发生同样的情况_C_Pointers_Struct_Linked List_Stack - Fatal编程技术网

C 释放指针时跟踪/断点陷阱,但在其他if语句中不会发生同样的情况

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

我有这个代码(我把最重要的部分放在下面):

结构卡{ 炭面[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; } 如果您向下滚动至
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;
}