strcpy
ajoute un caractère de fin nul '\0'
. Vous avez oublié de lui allouer de l'espace :
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Vous devez ajouter un espace pour 5 caractères :4 pour ".tde"
suffixe, et un de plus pour le '\0'
terminateur. Votre code actuel n'en alloue que 4, donc la dernière écriture est effectuée dans l'espace immédiatement après le bloc que vous avez alloué pour le nouveau nom de fichier (c'est-à-dire 0 octet après).
Remarque : Votre code a un problème commun - il attribue les résultats de realloc
directement à un pointeur en cours de réallocation. C'est bien quand realloc
réussit, mais crée une fuite de mémoire en cas d'échec. La correction de cette erreur nécessite de stocker le résultat de realloc
dans une variable distincte et en vérifiant qu'elle contient NULL
avant de remettre la valeur à *filename
:
char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
*filename = tmp;
} else {
// Do something about the failed allocation
}
Affectation directe à *filename
crée une fuite mémoire, car le pointeur le *filename
a pointé ci-dessous serait écrasé en cas d'échec, devenant irrécupérable.