Stavo cercando di fare pratica con il malloc “ing e liberare memoria, tuttavia quando ho eseguito la funzione free () in questo programma viene restituito un errore per un puntatore non valido. Qualcuno può dirmi cosa sto sbagliando?
Ecco lerrore: * Errore in `. / malloc1 “: free (): puntatore non valido: 0x000000000216c421 * Interrotto
Ed ecco il mio codice:
include
include
int main (void) {// apre un vecchio file FILE * old_file = fopen (“words.txt”, “r”); if (old_file == NULL) { printf (“Nessun file trovato.”); return 1;}
//open a new file FILE* new_file = fopen("new_words.txt", "w"); if (new_file == NULL) { printf("Unable to create file."); return 2; } for (int i = 0; i < 21; i++) { char* storage = malloc(sizeof(char)); if (storage == NULL) { printf("Error."); return 3; } fread(&storage, sizeof(char), 1, old_file); fwrite(&storage, sizeof(char), 1, new_file); free(storage); } //close both files fclose(old_file); fclose(new_file);
}
Risposta
Il problema risiede in fread(&storage, sizeof(char), 1, old_file);
Questa riga memorizza i dati letti direttamente nel puntatore, sovrascrivendo lindirizzo della memoria “d malloc”. Non sta memorizzando i dati nella memoria puntata dallindirizzo memorizzato nel puntatore. Quando viene eseguita la chiamata free (), sta cercando di liberare un indirizzo non valido. Sta anche creando una perdita di memoria perché lindirizzo della memoria malloc “d viene sostituito. Rimuovi &
da fread () e fwrite () e funzionerà.
Se questo risponde alla tua domanda, fai clic sul segno di spunta per accettare. Continuiamo con la manutenzione del forum. 😉