DPLL算法malloc 和 realloc报错SIGTRAP (Trace/breakpoint trap)

问题遇到的现象和发生背景

在做DPLL算法遇到了SIGTRAP (Trace/breakpoint trap)的问题:
构建了如图所示的数据结构

typedef struct Literal
{
    int val,exist=1;  //val表示值,exist 表示是否被删除
    struct Literal *next=NULL;
}Literal,*LinkLiteral;
typedef struct Clause
{
    int exist=1;
    Literal *first=NULL;
    struct Clause *next=NULL;
}Clause,*LinkClause;

img


其中
大致算法:

img

int DPLL(Clause *root)
{
    CStack Cs;LStack Ls;
    InitClauseStack(Cs), InitLiteralStack(Ls);      //把删除的Linkclause 和Linkliteral放在栈中恢复的时候用
    int num=IsSingle(root),a;
    while(num!=0)
    {
        if(num>0)   var[num].value=1;  //var[] 表示每个变元的取值
        else    var[abs(num)].value=0;
        Simplify(root,num,Cs,Ls);
        if(IsVacant(root)) return 1;
        else if(IsBlankLit(root))   return 0;
        num=IsSingle(root);
    }
    a= GetV3(root);
    Cbn(root,a);
    if(DPLL(root))  return 1;
    Revert(root,Cs,Ls);    //把上面消除的clause和literal恢复
    root->next=DeleteClause(root->next);  //将a删除
    free(Cs.s);
    free(Ls.s);
    Cbn(root,-a);
    return DPLL(root);
}

问题相关代码,请勿粘贴截图

有两处报错:

void CPush(CStack &CS, Clause *p)  //这个函数是将删除操作中删除的指针放到栈里保存
{
    if (CS.top>= CS.stacksize)
    {
        CS.s= (Clause**)realloc(CS.s, (CS.stacksize + STACKINCREMENT) * sizeof(Clause*));  //这里报错
        CS.stacksize += STACKINCREMENT;
    }
    CS.s[++CS.top] = p;
}

void Cbn(Clause *root,int num)   //这个函数是将选择的a加进去
{
    Clause *p=(Clause*) malloc(sizeof (Clause));  //这里报错
    p->next=root->next;
    p->exist=1;
    root->next=p;
    Literal *s=(Literal *) malloc(sizeof (Literal));
    p->first=s;
    p->first->val=num,p->first->next=NULL,p->first->exist=1;
}
运行结果及报错内容

第1个函数realloc报错(我把初始栈的大小设置大一点可以避免一些小的测试):

img


img

第2个函数malloc报错:
我不理解的就是第二个函数的malloc执行过几次了为什么还会报错

img

img

我想要达到的结果

我想知道这种情况是什么出现了错误