Errore di esecuzione programma in c

di il
4 risposte

Errore di esecuzione programma in c

Salve, vi scrivo per sapere se qualcuno di voi mi potrebbe dire perche durante l'esecuzione del programma sotto riportato, viene visualizzata questa linea di errore: "*** Error in `./b': free(): invalid next size (normal): 0x000000000149a250 *** Annullato (core dump creato)". Grazie mille.
PS: perdonatemi la poca leggibilità del programma.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 35

typedef struct str {

 char nome[M];
 char cognome[M];
 int giorno;
 int mese;
 int anno;
 char sesso;

} studenti;

typedef struct temp {

 char name[M];
 char surname[M];
 int day;
 int mounth;
 int year;
 char type;
} temporaneo;

int main(int argc,char *argv[]) {

int N;
FILE *a;
FILE *b;
FILE *c;
studenti *vett;
int cont=0;
int var=0;
int i;
int j;
temporaneo temp;
int imin;

if( argc == 4 ) {

  if ( ( a = fopen(argv[1],"r") ) == NULL ) {
   printf("Impossbile aprire il file\n");
   exit(1);
  }

   else { 
    fscanf(a,"%d", &N);   
    vett = (studenti *)malloc(N*sizeof(studenti));

    while( !cont ) { 
     fscanf(a,"%s", vett[var].nome);
     fscanf(a,"%s", vett[var].cognome);
     fscanf(a,"%d/%d/%d", &vett[var].giorno, &vett[var].mese, &vett[var].anno);      
     fscanf(a,"%c", &vett[var].sesso);
     printf("iuccia\n");

     if ( var==N-1)
       cont = 1;

     var++;
    }
   }
   fclose(a);


    for( i=0; i<N; i++ ) {
    imin = i;
     for( j=i+1; j<=N; j++ ) {
      if ( vett[j].anno < vett[imin].anno ) {
       imin = j;
       strcpy(temp.name,vett[i].nome);
       strcpy(vett[i].nome,vett[imin].nome);
       strcpy(vett[imin].nome,temp.name);

       strcpy(temp.surname,vett[i].cognome);
       strcpy(vett[i].cognome,vett[imin].cognome);
       strcpy(vett[imin].cognome,temp.surname);

       temp.day = vett[i].giorno;
       vett[i].giorno = vett[imin].giorno;
       vett[imin].giorno = temp.day;

       temp.mounth = vett[i].mese;
       vett[i].mese = vett[imin].mese;
       vett[imin].mese = temp.mounth;


       temp.year = vett[i].anno;
       vett[i].anno = vett[imin].anno;
       vett[imin].anno = temp.year;

       temp.type=vett[i].sesso;
       vett[i].sesso=vett[imin].sesso;
       vett[imin].sesso=temp.type; 
      }
      else {
       if ( vett[j].mese < vett[imin].mese ) {
       imin = j;
       strcpy(temp.name,vett[i].nome);
       strcpy(vett[i].nome,vett[imin].nome);
       strcpy(vett[imin].nome,temp.name);

       strcpy(temp.surname,vett[i].cognome);
       strcpy(vett[i].cognome,vett[imin].cognome);
       strcpy(vett[imin].cognome,temp.surname);

       temp.day = vett[i].giorno;
       vett[i].giorno = vett[imin].giorno;
       vett[imin].giorno = temp.day;

       temp.mounth = vett[i].mese;
       vett[i].mese = vett[imin].mese;
       vett[imin].mese = temp.mounth;


       temp.year = vett[i].anno;
       vett[i].anno = vett[imin].anno;
       vett[imin].anno = temp.year;

       temp.type=vett[i].sesso;
       vett[i].sesso=vett[imin].sesso;
       vett[imin].sesso=temp.type; 
       }
      else {
       if ( vett[j].giorno < vett[imin].giorno ) {
       imin = j;
       strcpy(temp.name,vett[i].nome);
       strcpy(vett[i].nome,vett[imin].nome);
       strcpy(vett[imin].nome,temp.name);

       strcpy(temp.surname,vett[i].cognome);
       strcpy(vett[i].cognome,vett[imin].cognome);
       strcpy(vett[imin].cognome,temp.surname);

       temp.day = vett[i].giorno;
       vett[i].giorno = vett[imin].giorno;
       vett[imin].giorno = temp.day;

       temp.mounth = vett[i].mese;
       vett[i].mese = vett[imin].mese;
       vett[imin].mese = temp.mounth;


       temp.year = vett[i].anno;
       vett[i].anno = vett[imin].anno;
       vett[imin].anno = temp.year;

       temp.type=vett[i].sesso;
       vett[i].sesso=vett[imin].sesso;
       vett[imin].sesso=temp.type; 
       }
      }//else 80
      }// else 84
     }
    }
for(i=0; i<N; i++) {   
free(vett[i].nome);
free(vett[i].cognome);
}

free(vett);

   if ( ( b = fopen(argv[2],"w") ) == NULL ) {
    printf("Impossibile aprire i file di scrittura");
    exit(1);
   }
   else {
    if ( (c = fopen(argv[3],"w")) == NULL) {
     printf("Impossibile aprire i file di scrittura");
     exit(1);
    }
   else {

   for(i=0; i<=N+1; i++ ) {
     if( vett[i].sesso=='M' ) {
      fprintf(b,"%s ", vett[i].nome);
      fprintf(b,"%s ", vett[i].cognome);
      fprintf(b,"%d/%d/%d ", vett[i].giorno,vett[i].mese,vett[i].anno);
      fprintf(b,"%c", vett[i].sesso);
      fprintf(b,"\n"); 
     }
     else if( vett[i].sesso=='F' ){
      fprintf(c,"%s ", vett[i].nome);
      fprintf(c,"%s ", vett[i].cognome);
      fprintf(c,"%d/%d/%d ", vett[i].giorno,vett[i].mese,vett[i].anno);
      fprintf(c,"%c", vett[i].sesso);
      fprintf(c,"\n");
     } 
   }
  }
 }
  fclose(b);
  fclose(c);
}

else {
 printf("numero valori immessi non valido\n");
 exit(1);
}
return 0;

}

4 Risposte

  • Re: Errore di esecuzione programma in c

    Queste free

    for(i=0; i<N; i++) {
    free(vett.nome);
    free(vett.cognome);
    }

    non hanno senso.
  • Re: Errore di esecuzione programma in c

    Ok, ma anche levandolo il problema persiste e non capisco il perchè.
  • Re: Errore di esecuzione programma in c

    Ho fatto una piccolo accorgimento al codice e adesso non mi da più errore: il problema è che non svolge più la sua funzione ossia quella di suddividere e copiare in due file differenti gli utenti femminili e maschili.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define M 35
    
    typedef struct str {
    
     char nome[M];
     char cognome[M];
     int giorno;
     int mese;
     int anno;
     char sesso;
    
    } studenti;
    
    typedef struct temp {
    
     char name[M];
     char surname[M];
     int day;
     int mounth;
     int year;
     char type;
    } temporaneo;
    
    int main(int argc,char *argv[]) {
    
    int N;
    FILE *a;
    FILE *b;
    FILE *c;
    studenti *vett;
    int cont=0;
    int var=0;
    int i;
    int j;
    temporaneo temp;
    int imin;
    
    if( argc == 4 ) {
    
      if ( ( a = fopen(argv[1],"r") ) == NULL ) {
       printf("Impossbile aprire il file\n");
       exit(1);
      }
    
       else { 
        fscanf(a,"%d", &N);   
        vett = (studenti *)malloc(N*sizeof(studenti));
    
        while( !cont ) { 
         fscanf(a,"%s", vett[var].nome);
         fscanf(a,"%s", vett[var].cognome);
         fscanf(a,"%d/%d/%d", &vett[var].giorno, &vett[var].mese, &vett[var].anno);      
         fscanf(a,"%c", &vett[var].sesso);
         printf("iuccia\n");
    
         if ( var==N-1)
           cont = 1;
    
         var++;
        }
       }
       fclose(a);
    
    
        for( i=0; i<N; i++ ) {
        imin = i;
         for( j=i+1; j<N; j++ ) {
          if ( vett[j].anno < vett[imin].anno ) {
           imin = j;
           strcpy(temp.name,vett[i].nome);
           strcpy(vett[i].nome,vett[imin].nome);
           strcpy(vett[imin].nome,temp.name);
    
           strcpy(temp.surname,vett[i].cognome);
           strcpy(vett[i].cognome,vett[imin].cognome);
           strcpy(vett[imin].cognome,temp.surname);
    
           temp.day = vett[i].giorno;
           vett[i].giorno = vett[imin].giorno;
           vett[imin].giorno = temp.day;
    
           temp.mounth = vett[i].mese;
           vett[i].mese = vett[imin].mese;
           vett[imin].mese = temp.mounth;
    
    
           temp.year = vett[i].anno;
           vett[i].anno = vett[imin].anno;
           vett[imin].anno = temp.year;
    
           temp.type=vett[i].sesso;
           vett[i].sesso=vett[imin].sesso;
           vett[imin].sesso=temp.type; 
          }
          else {
           if ( vett[j].mese < vett[imin].mese ) {
           imin = j;
           strcpy(temp.name,vett[i].nome);
           strcpy(vett[i].nome,vett[imin].nome);
           strcpy(vett[imin].nome,temp.name);
    
           strcpy(temp.surname,vett[i].cognome);
           strcpy(vett[i].cognome,vett[imin].cognome);
           strcpy(vett[imin].cognome,temp.surname);
    
           temp.day = vett[i].giorno;
           vett[i].giorno = vett[imin].giorno;
           vett[imin].giorno = temp.day;
    
           temp.mounth = vett[i].mese;
           vett[i].mese = vett[imin].mese;
           vett[imin].mese = temp.mounth;
    
    
           temp.year = vett[i].anno;
           vett[i].anno = vett[imin].anno;
           vett[imin].anno = temp.year;
    
           temp.type=vett[i].sesso;
           vett[i].sesso=vett[imin].sesso;
           vett[imin].sesso=temp.type; 
           }
          else {
           if ( vett[j].giorno < vett[imin].giorno ) {
           imin = j;
           strcpy(temp.name,vett[i].nome);
           strcpy(vett[i].nome,vett[imin].nome);
           strcpy(vett[imin].nome,temp.name);
    
           strcpy(temp.surname,vett[i].cognome);
           strcpy(vett[i].cognome,vett[imin].cognome);
           strcpy(vett[imin].cognome,temp.surname);
    
           temp.day = vett[i].giorno;
           vett[i].giorno = vett[imin].giorno;
           vett[imin].giorno = temp.day;
    
           temp.mounth = vett[i].mese;
           vett[i].mese = vett[imin].mese;
           vett[imin].mese = temp.mounth;
    
    
           temp.year = vett[i].anno;
           vett[i].anno = vett[imin].anno;
           vett[imin].anno = temp.year;
    
           temp.type=vett[i].sesso;
           vett[i].sesso=vett[imin].sesso;
           vett[imin].sesso=temp.type; 
           }
          }//else 80
          }// else 84
         }
        }
    
       if ( ( b = fopen(argv[2],"w") ) == NULL ) {
        printf("Impossibile aprire i file di scrittura");
        exit(1);
       }
       else {
        if ( (c = fopen(argv[3],"w")) == NULL) {
         printf("Impossibile aprire i file di scrittura");
         exit(1);
        }
       else {
    
       for(i=0; i<N; i++ ) {
         if( vett[i].sesso=='M' ) {
          fprintf(b,"%s ", vett[i].nome);
          fprintf(b,"%s ", vett[i].cognome);
          fprintf(b,"%d/%d/%d ", vett[i].giorno,vett[i].mese,vett[i].anno);
          fprintf(b,"%c", vett[i].sesso);
          fprintf(b,"\n"); 
         }
         else if( vett[i].sesso=='F' ){
          fprintf(c,"%s ", vett[i].nome);
          fprintf(c,"%s ", vett[i].cognome);
          fprintf(c,"%d/%d/%d ", vett[i].giorno,vett[i].mese,vett[i].anno);
          fprintf(c,"%c", vett[i].sesso);
          fprintf(c,"\n");
         } 
       }
      }
     }
      fclose(b);
      fclose(c);
    }
    
    else {
     printf("numero valori immessi non valido\n");
     exit(1);
    }
    return 0;
    
    }
  • Re: Errore di esecuzione programma in c

    Ho risolto il problema grazie per l'aiuto.
Devi accedere o registrarti per scrivere nel forum
4 risposte