Ecco qui i due metodi indagati:

In poche parole il primo metodo estrare le righe da un file txt in cui compare in lemma passato e le passa al secondo metodo che filtra le parole...La cosa strana è che funziona , per le prime righe, poi lancia un'eccezzione...dalle prove il problema è la malloc nel secondo metodo...ma perchè a volte funge e a volte no?

codice:
/* Metodo che rimuove dal file in input tutte le righe in cui compare il lemma passato */
void delete_lemma_all(FILE *stream, char *lemma){
     FILE *tmp;
     tmp = fopen("./file_tmp.txt", "w+");
     char linea[512];
     int row=0;
     while(fgets(linea,512,stream) != NULL ){
          if(strstr(linea, lemma) == NULL) { fprintf(tmp,"%s",linea); }
          else {printf("%s\n",linea); delete_lemma_all_2(linea, row);}
          row++;
     }
     fclose(tmp);
     fclose(stream);
     remove("./file.txt");
     rename("./file_tmp.txt","./file.txt");
     stream = fopen("./file.txt", "r+");
}

/* Metodo che estrae dalla stringa passate tutti lemmi, in modo da aggiornare il database */
void delete_lemma_all_2(char *linea, int row){
    int len = strlen(linea);
    char ch;
    char *lemma = NULL;
    int i=0;
    int k=0;
    lemma = (char*)malloc(sizeof(char)); /* DOPO UN PO SI IMPIANTA IN STA MALLOC!!! COME MAI? */
    if (lemma == NULL) { 
         printf("Errore nell'allocazione di memoria\n"); 
         exit (1); 
    }
    printf("Lunghezza linea: %d\n",len);
    /*while( (ch = linea[k]) != '\0' ){*/
    while(k<len){
          ch = linea[k];    
          if((((int)ch>64)&&((int)ch<91))||(((int)ch>96)&&((int)ch<123))){
                lemma = (char*)realloc(lemma,(i+1)*sizeof(char));
                if (lemma == NULL) { 
                   printf("Errore nell'allocazione di memoria\n"); 
                   exit (1); 
                }
                lemma[i]=ch;
                i++;
          }else{
                lemma[i]='\0';
                if ((i>3)&&(i<MAX_LEMMA)) printf("->%s\n",lemma);
                i=0;
                free(lemma);
          }
          k++;
    }
    lemma[i]='\0';
    if ((i>3)&&(i<MAX_LEMMA)) printf("%s\n",lemma);
    free(lemma);
}
grazie mille, sono giorni che ci sto sbattendo la testa senza cavarci niente!