在做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;
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报错(我把初始栈的大小设置大一点可以避免一些小的测试):
第2个函数malloc报错:
我不理解的就是第二个函数的malloc执行过几次了为什么还会报错
我想知道这种情况是什么出现了错误