Я студент, и сейчас я пытаюсь выполнить задачу в C.C: Где я должен освобождать свои указатели?
Я написал алгоритм, который работает до сих пор. Он получает файл, чтобы определить, является ли включенное логическое выражение выполнимым (SAT-Solver). Проблема в том, что через некоторое время я получаю ошибку Segementation Fault, когда я пытаюсь использовать ее с большими файлами (около 60 МБ). Я думаю, что это так, потому что я использую malloc пару раз, но я еще не освобождаю эту память, потому что я не знаю, куда помещать бесплатные() выражения.
Существует один метод, который называет себя дважды каждый раз. Код выглядит следующим образом:
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, которые хотели бы мне помочь? Большое спасибо! :)
Отсутствие 'free''s не вызовет« ошибки сегментации », предположим, что вам нужны все эти данные сразу, почему вы бы назвали' free'? Вы должны называть 'free', когда вам это больше не нужно. В коде есть что-то не так: вы не проверяете успех «malloc», но я не думаю, что это причина «сегментационной ошибки», хотя это может быть и одно. –
Сколько раз вы оцениваете 'DPLL', чтобы называть себя? это может быть проблемой. –
Есть ли в «волшебной магии» какая-то магия, чтобы вернуться из функции? –