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.