Snažil jsem se procvičovat malloc a uvolnění paměti, ale když v tomto programu spustím funkci free () je vrácena chyba pro neplatný ukazatel. Může mi někdo říct, co dělám špatně?
Tady je chyba: * Chyba v `. / malloc1 „: free (): invalid pointer: 0x000000000216c421 * Zrušeno
A tady je můj kód:
zahrnout
zahrnout
int main (void) {// otevřít starý soubor FILE * old_file = fopen („words.txt“, „r“); if (old_file == NULL) { printf („Nebyl nalezen žádný soubor.“); návrat 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);
}
Odpověď
Problém spočívá v fread(&storage, sizeof(char), 1, old_file);
Tento řádek ukládá data načtená přímo do ukazatele a přepíše adresu paměti malloc „d. Neukládá data do paměti, na kterou ukazuje adresa uložená v ukazateli. Když je provedeno volání free (), pokouší se uvolnit neplatnou adresu. Vytváří také únik paměti, protože se nahrazuje adresa paměti malloc „d. Odstraňte &
z fread () a fwrite () a bude fungovat.
Pokud to odpovídá na vaši otázku, přijměte prosím zaškrtnutím políčka. Pokračujeme v údržbě fóra. 😉