2011-12-04 7 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

このように割り当てると、 'double * results = malloc(resultSize * sizeof(* results));'型名をあちこちに書く必要はありません。 –

+0

ありがとうございますが、ポインタをdoubleにキャストしませんか? –

+0

Cでポインタをキャストする必要はありません。変換は暗黙的です。 –

答えて

1

runge_kutta_2nd_orderにヒープオーバーフローがあります。ループを慎重にチェックして、index < resultSizeが常に保持されることを確認します。

+0

ありがとうございます。私は前に割り当てられた配列の外側に書きました。 –

関連する問題