Salve, ho un problema con il seguente codice C.

La funzione candida restituisce Segmentations Fault. In compilazione Code::Blocks restituisce una compilazione pulita con 0 errors, 0 warnigns, non riesco a capire perchè non appena vado ad usare la struttura in precedenza creata ottengo segmentations fault. Tale errore mi farebbe pensare ad un problema con il puntatore, cosa più comune se usassi una lista che di fatto non sto usando.

Ho la certazza del corretto funzionamento della fase di allocazione della struttura, e del suo riempimento, questo perchè, subito dopo "queste due fasi" richiamo una funzione di debug che mi printa a video tutto il contenuto della struct.

La funzione successiva è la "candida" che puntalmente finisce in seg. fault, non riuscendo a venirne a capo l'ho commentata e ricopiato nella funzione incriminata il codice della debug print....il risultato non cambia, sono fermo a questo maledetto segmentations fault.

codice:
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#define     Max_name 25+1
#define     db 1
#define     year 366
#define     inARG 7+1

/*+++++++++++++STRUTTURA DATI+++++++++++++*/

typedef struct PostiLiberi{
    //---STAMPA---//
    int tmpA,J;
    //------------//
    //-ASSEGNAZIONE-//
    int ON;
    //--------------//
    int  bed,Year[year];
    char osp[Max_name],rep[Max_name];
    }B_Free;
/*++++++++++++++++++++++++++++++++++++++++*/

B_Free* Alloca(B_Free *,int);
void Make_DB(B_Free *,FILE *);
void db_PRINT(B_Free *,int);
int cerco(B_Free *,char *,int);
void bsy_PRINT(B_Free *,int,int,int);

int main(){
    printf("\n Esempio file di imput ");
    printf("\n*************************");
    printf("\n6\ncto cardiologia 1\nmolinette cardiologia 1\ncto chirurgia 31\nmondovi chirurgia 3\nfossano neurologia 56\nverona orbitorio 15");
    printf("\n*************************\n");

    B_Free *strt;
    strt==NULL;

    FILE *fin1;
    char in1[inARG];
    int M_R,day,I;

    printf("Nome file: ");
    scanf("%s",in1);
    if((fin1=fopen(in1,"r"))==NULL){
        fprintf(stderr,"\nERROR!: I can't open your file %s ",in1);
        exit(EXIT_FAILURE);
      }

    fscanf(fin1,"%d",&M_R);
    if(db==1)
        fprintf(stdout,"\nDim struct:%d:",M_R );

    strt=Alloca(strt,M_R);
    //Leggo il file.
    Make_DB(strt,fin1);
    //Terminata la fase di acquisizione lo chiudi.
    fclose(fin1);
    if(db==1)
        db_PRINT(strt,M_R);
    //GESTIONE DEL MENU DI RICHIESTA DATI:
    printf("\nComando: ");
    scanf("%s %d",in1,&day);
    if(day<0)
        printf("\nPRENOTAZIONE NON EFFETTUATA");
        else{
            //INIZIA RICERCA DISPONIBILITA LETTO-GIORNI CONSECUTIVI. devi ritornare i del candidato prescelto. Se la ricerca fallsice I=-1.
           I=candida(strt,in1,M_R);
            if(I==-1)
                printf("\nPRENOTAZIONE NON EFFETTUATA");
                else{
                    //PRINTA' in modo definitivo il vettore Year della struct, Parametri da passare-> (strt,dim,n).

                }
        }

    return 0;
    }

B_Free* Alloca(B_Free *ptr,int dim){
    ptr=(B_Free*)malloc(dim*sizeof(B_Free));
    if(ptr==NULL){
        fprintf(stderr,"MALLOC FAILURE");
        exit (EXIT_FAILURE);
        }
    if(db==1)
        fprintf(stdout,"Memory request ok!");
    return(ptr);
    }

void Make_DB(B_Free *ptr,FILE *dati){
    int i=0;
    while(fscanf(dati,"%s %s %d",ptr[i].osp,ptr[i].rep,&ptr[i].bed)!=EOF)
        i++;
}

void db_PRINT(B_Free *ptr,int dim){
    printf("\n*********DEBUG FUNCTIONS*********");
    int i=0;
        for(;i<dim;i++)
            printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
    printf("\n------AND OF DEBUG FUNCTIONS-----");
}




/* FUNZIONE PRESENTA LO STESSO PROBLEMA.....NON ARRIVA A STAMPARE IL PRIMO IF

int candida(B_Free *ptr,char *repa,int dim){
    int x=0,tmpX=-1,c,j=0;
        if(db==1)
            fprintf(stdout,"Parametri ricevuti: reparto : %s dim struct:%d \n",repa,dim);
    while(x!=dim){
            if(strcmp(repa,ptr[x].rep)==0 && ptr[x].bed>0){
                if(db==1)
                    fprintf(stdout,"\n TROVATO REPARTO, LETTO FREE. next step [giorni liberi consecutivi].\n Salvo l'indice in di x in tmpX ");
                tmpX=x;
                //ricerco consecutivi..
                //j fa scorrere tutto l'anno
                j=0;
                c=0;
                while(c!=dim){
                    if(ptr[x].Year[j]==0){
                        c++;
                    }else
                        c=0;
                    j++;
                    if(j==365)
                        j=0;
                }//QUANDO QUESTO CICLO TERMINA C CONTIENE IL GIORNO FINALE DELLA PRENOTAZIONE
                }else
                ptr[x].ON=-1;
        x++;
    }
    if(tmpX!=-1)
        return -1;
        else
            return tmpX;
}


*/

//LA SEGUENTE FUZNIONE E' IDENTICA ALLA FUNZIONE DI PRINT DEBUG...MA NON FUNZIONA.

int candida(B_Free *ptr,char *repa,int dim){
    int tmpX=-1;
    int i=0;
     for(;i<dim;i++)
        printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
    return tmpX;
}

void bsy_PRINT(B_Free *ptr,int dim,int I,int n){
    int J,x,tmp;
    //I indice ospedale da occupare.
    //J contine l'ultimo giorno occupato
    //n il n° di giorni di decenza. risalgo a quello inziale decrementandoli entrambi.
    for(x=0;x<dim;x++){
        if(ptr[x].tmpA==1){
            J=ptr[x].J;
        }
    }
    tmp=J;
    while(n!=0){
        ptr[I].Year[J]=1;
        J--;
        n--;
    }
    printf("Prenotazione effettuata in: %s dal:%d al:%d lettoNUMERO:%d",ptr[I].osp,J,tmp,ptr[I].bed);
}
Link dell'sercizio -> http://fmgroup.polito.it/quer/teachi...7/20070716.pdf