strcpy
agrega un carácter terminador nulo '\0'
. Olvidaste asignarle espacio:
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
Debe agregar espacio para 5 caracteres:4 para ".tde"
sufijo, y uno más para el '\0'
terminador Su código actual asigna solo 4, por lo que la última escritura se realiza en el espacio inmediatamente después del bloque que ha asignado para el nuevo nombre de archivo (es decir, 0 bytes después).
realloc
directamente a un puntero que se está reasignando. Esto está bien cuando realloc
tiene éxito, pero crea una pérdida de memoria cuando falla. Reparar este error requiere almacenar el resultado de realloc
en una variable separada y verificándola para NULL
antes de volver a asignar el valor 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
}
Asignando directamente a *filename
crea una fuga de memoria, porque el puntero el *filename
ha estado señalando a continuación se sobrescribiría en caso de falla y se volvería no recuperable.