strcpy aggiunge un carattere di terminazione nullo '\0' . Hai dimenticato di allocare spazio:
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Devi aggiungere spazio per 5 caratteri:4 per ".tde" suffisso e un altro per il '\0' terminatore. Il tuo codice attuale ne alloca solo 4, quindi l'ultima scrittura viene eseguita nello spazio immediatamente dopo il blocco che hai allocato per il nuovo nome file (cioè 0 byte dopo di esso).
Nota: Il tuo codice ha un problema comune:assegna i risultati di realloc direttamente a un puntatore che viene riallocato. Questo va bene quando realloc ha successo, ma crea una perdita di memoria quando fallisce. La correzione di questo errore richiede la memorizzazione del risultato di realloc in una variabile separata e controllandola per NULL prima di assegnare nuovamente il valore a *filename :
char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
*filename = tmp;
} else {
// Do something about the failed allocation
}
Assegnazione diretta a *filename crea una perdita di memoria, perché il puntatore *filename puntato di seguito verrebbe sovrascritto in caso di errore, diventando irrecuperabile.