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.