Ayuda con segmentación fault:11

Imagen de Halocratos
0 puntos

Hola a todos. Estoy haciendo un programa que calcula soluciones de la ecuación x-tanx=0 mediante el método de Newton-Rhapson y el de Regula-Falsi (está dividido en 4 archivos: el de newton, el de regula, el main y el .h). El caso es que compila bien con la orden " gcc -Wall main.c Newton.c Regula.c -lm -o eq" , pero cuando lo ejecuto , en el momento de empezar a calcular valores da el fallo de segmentation fault:11. Os adjunto los códigos, a ver si me decís donde está el error :
main.c

//
//  main.c
//  Resolució d'equacions no lineals
//
//  Created by Vernon Albayeros Duarte on 03/05/12.
//  Copyright (c) 2012 drkztan. All rights reserved.
//

#include 
#include 
#include 
#include "lib.h"
char respuesta;
double t;
int n;
double* y;
double x;
double* a;   
double* b;
double* c;

int main()
{
    principio:
    printf("Que metodo quieres utilizar? Regula-falsi (r) o Newton(n)?");
    scanf("%c", &respuesta);
    printf("Tolerancia?\n");
    scanf ("%lg", &t);
    printf("Número de iteraciones?\n");
    scanf("%d", &n);
    
    if (respuesta== 'r')
    {printf("Introduce el punto inicial del intervalo(a):");
	  scanf("%lg", &a[0]);
	  printf("Introduce el punto final del intervalo (b):");
	  scanf("%lg", &b[0]);
	  regula(a[0], b[0], n, t);
      }
    else if (respuesta== 'n')
    {
        printf("Con que punto quieres comenzar?");
        scanf("%lg", &x);
        
         calculonewton (t, n, x);
        
        if (y[0]==0) {printf("Variable inválida, vuelve a correr el programa");
            goto principio;
        }
        
        
        else if (y[0]==1)
        {if (y[1]==1)
        {printf("La función ha parado porque se han acabado las iteraciones. El punto es %f", y[2]);
            return 0;
            }
          
        else if (y[1]==0)
        {printf("La función ha parado porque se ha llegado a la tolerancia. El punto es %f", y[2]);
            return 0;
        }
            
            
        }
        
    }    else {printf("No has dado una respuesta válida, vuelve a correr el programa.");
}
    return 0;

}

lib.h

//
//  lib.h
//  Resolució d'equacions no lineals
//
//  Created by Vernon Albayeros Duarte on 03/05/12.
//  Copyright (c) 2012 drkztan. All rights reserved.
//

#ifndef Resolucio__d_equacions_no_lineals_lib_h
#define Resolucio__d_equacions_no_lineals_lib_h

extern double calculonewton () ;
extern double regula ();

#endif

Regula.c

//
//  Regula.c
//  Resolució d'equacions no lineals
//
//  Created by Vernon Albayeros Duarte on 03/05/12.
//  Copyright (c) 2012 drkztan. All rights reserved.
//

#include 
#include 
#include 
double* a;   //los punteros a, b y c que usaremos
double* b;
double* c;
int n;
int i;

double regula(double* a, double* b, int n, double t,  double* c)         //LA FUNCION REGULA
{
 
    if ((a[0]-tan(a[0]))==0) {printf("El punto a ya es solución de la ecuación.\n");}       //condiciones de error si los parametros iniciales no son validos
    if ((b[0]-tan(b[0]))==0) {printf("El punto b ya es solución de la ecuación.\n");}
    else if (((a[0]-tan(a[0]))*(b[0]-tan(b[0])))>0) {printf("Debes introducir puntos extremo cuya imagen tenga diferente signo.\n");}
    else                 //el metodo si los puntos introducidos son adecuados
   { 
     a=( double*) malloc((n)*sizeof(double));   //asignacion de memoria a los punteros a, b y c
     b=( double*) malloc((n)*sizeof(double));
     c=( double*) malloc((n)*sizeof(double));
     
       for(i=0; i<=n ; i++)         //loop hasta el numero de iteraciones introducido en main (n)
    {
      c[i]=((b[i]*tan(a[i]))-(a[i]*tan(b[i])))/(b[i]-a[i]+tan(a[i])-tan(b[i]));          //calculo del punto siguiente  c[i] a partir de a[i], b[i]  
      if((c[i]-tan(c[i]))<=t) {printf("Una solución aceptable es x=%lg \n", c[i]);}       //evaluacion de si c es solucion aceptable
      else                                                                      //en caso contrario...
	  {
	    if (((a[i]-tan(a[i]))*(c[i]-tan(c[i])))<0)                                  //asignacion de final de loop segun los signos de c[i] y a[i]
	      {
		a[i+1]=a[i];
		b[i+1]=c[i];
	      }
	    else 
	      {
		a[i+1]=c[i];
		b[i+1]=b[i];
	      }
	  }
    } //cierre del loop
 
   } //cierre de funcion
  
    return 0;
    
}

Newton.c

//
//  lib.c
//  Resolució d'equacions no lineals
//
//  Created by Vernon Albayeros Duarte on 03/05/12.
//  Copyright (c) 2012 drkztan. All rights reserved.
//

#include 
#include 
#include 



double calculonewton (double t, int n, double x, double *y)


{
    
    int i;
    double derivada;
    double imagen;
    y=(double*) malloc(3*sizeof(double) );

    y[2]=x;
    
    
    for (i=1; i<=n; i++)
    {
        imagen = y[2] - tan(y[2]);
        derivada = -(tan(y[2])*tan(y[2]));
        if (derivada == 0) 
            {printf("punto inicial no adecuado");
                return (y[0]=0);
        }
        
        x= y[2] - (imagen / derivada);
        y[2]=x;
        printf("%lg\n", y[2]);
        
        if ((0-y[2])<=t)
        {
            y[0]=1;
            y[1]=0;
            return 0;
        }
    }
    y[0]=1;
    y[1]=1;
    
    
    return 0; // la función está hecha para que nos devuelva 3 valores: y[0] nos dice si la variable inicial está correcta, y[1] nos dice, en el caso de tener una variable incial válida, el motivo de que la función termine, ya sea porque converja o porque se acaben las iteraciones deseadas, y finalmente y[2] nos dice la respuesta final que buscábamos. Al ser punteros, no hace falta devolver valores
    
}