Próbowałem ćwiczyć malloc i zwalnianie pamięci, jednak kiedy uruchamiam funkcję free () w tym programie zwracany jest błąd dla nieprawidłowego wskaźnika. Czy ktoś może mi powiedzieć, co robię źle?
Oto błąd: * Błąd w pliku „. / malloc1 „: free (): invalid pointer: 0x000000000216c421 * Przerwano
A oto mój kod:
include
include
int main (void) {// otwórz stary plik PLIK * old_file = fopen („words.txt”, „r”); if (old_file == NULL) { printf („Nie znaleziono pliku.”); 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);
}
Odpowiedź
Problem leży w fread(&storage, sizeof(char), 1, old_file);
Ta linia przechowuje dane odczytane bezpośrednio we wskaźniku, nadpisując adres pamięci malloc „d. Nie przechowuje danych w pamięci wskazywanej przez adres przechowywany we wskaźniku. Gdy wywołanie free () jest wykonywane, próbuje zwolnić nieprawidłowy adres. Tworzy również wyciek pamięci, ponieważ adres pamięci malloc „d jest zastępowany. Usuń &
z funkcji fread () i fwrite () i będzie działać.
Jeśli to odpowiada na Twoje pytanie, kliknij znacznik wyboru, aby zaakceptować. Kontynuujmy konserwację forum. 😉