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. 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *