strcpy
přidá nulový ukončovací znak '\0'
. Zapomněli jste mu přidělit místo:
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Je třeba přidat mezeru pro 5 znaků:4 pro ".tde"
příponu a ještě jednu pro '\0'
terminátor. Váš aktuální kód alokuje pouze 4, takže poslední zápis se provede do prostoru bezprostředně za blok, který jste alokovali pro nový název souboru (tj. 0 bajtů za ním).
Poznámka: Váš kód má společný problém – přiřazuje výsledky realloc
přímo na ukazatel, který se přerozděluje. To je v pořádku, když realloc
je úspěšná, ale při selhání způsobí nevracení paměti. Oprava této chyby vyžaduje uložení výsledku realloc
v samostatné proměnné a zkontrolujte, zda obsahuje NULL
před přiřazením hodnoty zpět do *filename
:
char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
*filename = tmp;
} else {
// Do something about the failed allocation
}
Přiřazení přímo do *filename
vytváří nevracení paměti, protože ukazatel *filename
který ukazuje níže, by se při selhání přepsal a stal by se neobnovitelným.