Hello.

I apologize if this topic has been covered somewhere else, but I thought that it might be best to post my code. I was struggling with pointer types earlier, and this page passing dynamicaly allocated 2d arrays helped me to find a solution to that. But I am still getting a segmentation fault, and I don't know what's causing it. I am sort of new to C (I knew some C++, but I wasn't great at that either), and the whole double pointer thing is a bit confusing. I know that I'm trying to get to memory that I don't have, but I don't know where.

Thanks

This is the program, in its entirety:

Code:/* This is a single body test simulation */ #include <stdio.h> #include <math.h> #include <stdlib.h> #define G 6.7*pow(10,-11) #define m_s 2*pow(10,5) /* Mass of the sun, in units of 10^25 kg */ #define t_max pow(10,8) /* stop time */ #define h 1 /* stepsize */ double xdot(double **arrayptr, double delta, short j, unsigned int i); /* an easy reference for the first order equations */ void RungeKutta4(double**, unsigned int i); /* iteration for forth order (4 step) method */ int main() { const unsigned int n = t_max/h; /* array size */ double** data; /* this holds the datas */ unsigned int i; /* loop index */ FILE *fp; data = malloc(4*sizeof(double*)); for(i=0; i<n; ++i) data[i] = malloc( n*sizeof(*data[i]) ); data[0][0] = 0; /* initial earth x-position */ data[1][0] = 1.5 * pow(10,10); /* initial earth y-position */ data[2][0] = 3 * pow(10,-6); /* initial earth x-velocity */ data[3][0] = 0; /* initial earth y-velocity */ for(i=0; i<n; ++i) RungeKutta4(data, i); fp = fopen("single_body.txt", "w+"); fwrite(data, sizeof(double), 4*n*sizeof(double)/sizeof(double), fp); return 0; } double xdot(double **data0, double delta, short j, unsigned int i) /* returns a first order ODE from the system of ++j equations */ { if(j<2) return (data0[j+2][i] + delta); else /* |r|^3 is calculated twice, but it's a bit messy if you don't */ return G * m_s * (-(data0[j-2][i] + delta) )/pow(sqrt( pow(-(data0[j][i] + delta),2) + pow(-(data0[j][i] + delta), 2) ), 3); } void RungeKutta4(double **datai, unsigned int i) /* a single 'four'-step iteration */ { short j; double s1, s2, s3, s4; for(j = 0; j<4; ++j) { s1 = xdot(datai, 0, j, i); s2 = xdot(datai, h*s1/2, j, i); s3 = xdot(datai, h*s2/2, j, i); s4 = xdot(datai, h*s3, j, i); datai[j][i+1] = datai[j][i] + h*(s1 + 2*s2 + 2*s3 +s4)/6; } }