C:我应该把指针放在哪里?

时间:2015-01-13 21:13:44

标签: c pointers memory recursion free

我是学生,我正在尝试用C完成一项任务。

我写了一个算法,到目前为止工作正常。它获取一个文件来检测包含的逻辑表达式是否可满足(SAT-Solver)。问题是,一段时间后,当我尝试将其用于更大的文件(大约60MB)时,我得到了一个Segementation Fault。我认为是,因为我使用malloc几次,但我还没有释放那段记忆,因为我不知道将free()表达放在哪里。

有一种方法,每次调用自己两次。代码如下所示:

int DPLL (int *pointer, int variablen, int anzahlklauseln)
{
int newliteral;
int neueklauseln;
int *neuphi;
int *neuphi2;
int *unitclauses;
int *pureliterals;
int offsetzaehler;
int rek1, rek2;

klauseln = anzahlklauseln;
unitclauses = (int *) malloc(klauseln * sizeof(int));
pureliterals = (int *) malloc(variablen * sizeof(int));

if (isEmpty())
{
    return 1;

}

if (ContainsEmptyClause(pointer, variablen))
{
    return 0;
}

unitClauses(pointer, variablen, unitclauses);
if (unsatisfiable)
{
    unsatisfiable = 0;
    return 0;
}

int iunitclauses = 0;
while (unitclauses[iunitclauses] != 0)
{
    unitPropagate(pointer, variablen, unitclauses[iunitclauses++]);
}

if (quicksati(pointer, variablen))
{
    return 1;
}

pureLiterals(pointer, variablen, pureliterals);

int ipureliterals = 0;
while (pureliterals[ipureliterals] != 0)
{
    pureLiteralAssign(pointer, variablen, pureliterals[ipureliterals++]);
}

if (quicksati(pointer, variablen))
{
    return 1;
}

newliteral = chooseliteral(pointer, variablen);

neuphi = (int*) malloc(variablen * (klauseln + 1) * sizeof(int));
neuphi2 = (int*) malloc(variablen * (klauseln + 1) * sizeof(int));

int *hilfspointer = pointer;

offsetzaehler = 0;
for (int i = 0; i < (klauseln +1); ++i)
{
    for (int j = 0; j < variablen; ++j)
    {
        if (i == klauseln)
        {
            neuphi[offsetzaehler] = 0;
            neuphi2[offsetzaehler] = 0;
        }
        else
        {
            neuphi[offsetzaehler] = *hilfspointer;
            neuphi2[offsetzaehler++] = *hilfspointer++;
        }
    }
}

neueklauseln = klauseln + 1;

addClause(neuphi, variablen, newliteral);
addClause(neuphi2, variablen, (-newliteral));

if (DPLL(neuphi, variablen, neueklauseln))
{
    return 1;
}
else
{
    return DPLL(neuphi2, variablen, neueklauseln);
}
}

现在我想我应该像这样编辑最后几行:

rek1 = DPLL(neuphi, variablen, neueklauseln);
rek2 = DPLL(neuphi2, variablen, neueklauseln);

free(neuphi);
free(neuphi2);
free(unitclauses);
free(pureliterals);

return rek1 || rek2;

但是之后我会得到文件的分段错误错误,之前有效。

然后我尝试了这样:

if (DPLL(neuphi, variablen, neueklauseln))
{
    return 1;
}
else
{
    free(neuphi);
    free(unitclauses);
    free(pureliterals);
    rek1 = DPLL(neuphi2, variablen, neueklauseln);
    free(neuphi2);
    return rek1;
}

然后我会得到更多的分段错误。

所以这里的C专家,谁愿意帮助我?非常感谢! :)

1 个答案:

答案 0 :(得分:1)

您的递归没有退出条件,因此程序在遇到堆栈溢出时或者当malloc调用因堆内存耗尽而返回空指针时会遇到分段错误,无论先发生什么。