Yritin harjoitella malloc-muistin muodostamista ja vapauttamista, mutta kun suoritin free () -toimintoa tässä ohjelmassa virheelliselle osoittimelle palautetaan virhe. Voisiko kukaan kertoa minulle, mitä teen väärin?
Tässä virhe: * Virhe `. / malloc1 ”: free (): virheellinen osoitin: 0x000000000216c421 * Keskeytetty
Ja tässä koodini:
include
sisälly
int main (void) {// avaa vanha tiedosto FILE * old_file = fopen (”words.txt”, ”r”); if (old_file == NULL) { printf (”Tiedostoa ei löydy.”); 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);
}
Vastaa
Ongelma on fread(&storage, sizeof(char), 1, old_file);
Tämä rivi tallentaa tiedot, jotka luetaan suoraan osoittimeen, korvaten malloc-d-muistin osoitteen. Se ei tallenna tietoja muistiin, johon osoitinosoitteeseen tallennettu osoite osoittaa. Kun ilmainen () puhelu suoritetaan, se yrittää vapauttaa virheellisen osoitteen. Se luo myös muistivuotoa, koska malloc ”d-muistin osoite on korvattu. Poista &
taulusta () ja fwrite () ja se toimii.
Jos tämä vastaa kysymykseesi, napsauta valintamerkkiä hyväksyäksesi. Jatketaan foorumin ylläpitoa. 😉