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;
}