Я пытаюсь реализовать правило Симпсона 1/3 в C и столкнулся с проблемой использования malloc внутри цикла for.
Моя текущая реализация
int integrateSimpson(Integrate *intereg)
{
int i, j, iLoop, last;
double *tempOne = (double *) malloc(sizeof(double) * 1);
double *tempTwo = (double *) malloc(sizeof(double) * 1);
double dx, sumOdd, sumEven, area;
double lowerLimit = intereg->lowerLimit;
double upperLimit = intereg->upperLimit;
int *intervals = intereg->intervals;
int nIntervals = intereg->nIntervals;
int method = intereg->method;
for(j = 0; j < nIntervals; j++ )
{
printf("Number of Intervals: %d",nIntervals);
for(iLoop = 0; iLoop < nIntervals; iLoop++){
printf("\nIntervals: %d", intervals[iLoop]);
}
tempOne = (double *) realloc(tempOne, sizeof(double) * intervals[j]);
tempTwo = (double *) realloc(tempTwo, sizeof(double) * intervals[j]);
if(tempTwo == NULL || tempOne == NULL)
{
TRACE("Could not realloc memory to temporary arrays");
return EXIT_FAILURE;
}
if(intervals[j] % 2 != 0)
{
TRACE("Found odd interval, adding 1 to make it even");
intervals[j] = intervals[j] + 1;
}
dx = (upperLimit - lowerLimit) / intervals[j];
for(i = 0; i <= intervals[j]; i++)
{
tempOne[i] = lowerLimit + i * dx;
tempTwo[i] = intereg->func(tempOne[i]);
}
sumOdd = 0;
sumEven = 0;
for(i = 1; i < intervals[j]; i++)
{
if(i % 2 == 1)
{
sumOdd += tempTwo[i];
}
else
{
sumEven += tempTwo[i];
}
}
printf("\nPassed %d time", j );
last = intervals[j] - 1;
area = dx / 3 * (tempTwo[0] + tempTwo[last] + 4 * sumOdd + 2 * sumEven);
intereg->areaUnderCurve[j] = area;
intereg->resultMatrix[method - 1][j] = intereg->areaUnderCurve[j];
}
free(tempOne);
tempOne = NULL;
free(tempTwo);
tempTwo = NULL;
return EXIT_SUCCESS;
}
Я попытался отладить это и обнаружил, что для intervals = {2,8,16,64}
цикл работает нормально в первый раз, даже часть realloc, но со второй итерацией по какой-то причине realloc не работает, и я получаю ошибку сегментации. Я попытался воспроизвести эту проблему следующим образом, но код ниже работает нормально
int i;
double *temp;
/* Initial memory allocation */
temp = (double *) malloc(sizeof(double)*1);
/* Reallocating memory */
for(i = 0;i<10;i++)
{
temp = (double *) realloc(temp, sizeof(double)* i);
}
free(temp);
temp = NULL;
Я знаю, что realloc в основном назначает новую память, одновременно освобождая память, указанную переданным ей указателем. Но что плохого в том, что я здесь делаю?
Также это хороший способ использовать malloc с циклами?
Любое руководство ценится!