将指针释放到数组时程序崩溃了,为什么?

时间:2011-12-04 19:49:30

标签: c methods numerical

  

可能重复:
  Is this C-program correct(pointers and arrays)?

当我最终释放mallocated数组时,我的程序崩溃了。为什么? 另外,我不是100%首先如何分配它。该程序按预期工作,除非我释放指针时发生崩溃。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Approximates a solution to a differential equation on the form: 
   y'(t) + ay(t) = x(t)
   y(0) = b 
*/
double* runge_kutta_2nd_order(double stepSize, double a, double b, double (*x) (double), double upto)
{
    int resultSize = ((int) (upto / stepSize)) + 1;
    double yt = b;
    double time;
    double k1,k2,ystar1,ystar2;
    int index = 1;

    double *results = (double*) malloc(resultSize * (sizeof(double)));
    if(results == NULL)
        exit(0);

    results[0] = b;

    for(time = 0; time <= upto; time += stepSize)
    {
        k1 = x(time) - a * yt;
        ystar1 = yt + stepSize * k1;
        k2 = x(time + stepSize) - a * ystar1;
        ystar2 = yt + (k1 + k2) / 2 * stepSize;
        yt = ystar2;
        results[index] = ystar2;
        index++;
    }
    return results;
}

void free_results(double *r)
{
    free(r);
    r = NULL;
}


double insignal(double t)
{
    return exp(t/2)*(sin(5*t) - 10*cos(5*t));
}



int main(void)
{
    int i;
    double *res = runge_kutta_2nd_order(0.01,-1,0,&insignal,10);
    printf("\nRunge Kutta 2nd order approximation of the differential equation:");
    printf("\ny'(t) - y(t) = e^(t/2) * (sin(5t) - 10cos(5t))");
    printf("\ny(0) = 0");
    printf("\n0 <= t <= 10");

    for(i=0; i<1001; i++){
        printf("\ni = %lf => y = ", 0.01*i);
        printf("%lf", res[i]);
    }
    printf("\n");

    free_results(res);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

runge_kutta_2nd_order中有堆溢出。仔细检查循环以确保index < resultSize始终保持。