Realloc не может выделить память при использовании в цикле - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь реализовать правило Симпсона 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 с циклами?

Любое руководство ценится!

...