2011-12-04 62 views
1

可能重复:
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; 
} 
+3

如果分配是这样的:'双*结果=的malloc(resultSize *的sizeof(*结果));'你并不需要在所有写类型名称。 –

+0

谢谢,但这并没有把指针翻倍,是吗? –

+0

您不需要在C中转换指针。转换是隐式的。 –

回答

1

您在runge_kutta_2nd_order有一个堆溢出。仔细检查循环以确保index < resultSize始终成立。

+0

感谢正确的,现在它FIEX 。我之前写过分配数组之外。 –

相关问题