No debes hacer
porque lo primero que hace la función es buscar el caracter '\0' de la cadena final. Al no haberla inicializada a 0 esta contiene datos aleatorios y '\0' puede estar en cualquier sitio. Una vez que strcat encuentra este carácter nulo empezará a copiar t1 ahí.
Para solucionarlo cambia strcat por strcpy que copia desde el principio de la cadena.
Por otra parte: es de mala práctica esconder puntero detrás de un typedef. Mejor si dejas los punteros vistos.
Código (c++) [Seleccionar]
strcat(final->caracteres, t1 ->caracteres);
porque lo primero que hace la función es buscar el caracter '\0' de la cadena final. Al no haberla inicializada a 0 esta contiene datos aleatorios y '\0' puede estar en cualquier sitio. Una vez que strcat encuentra este carácter nulo empezará a copiar t1 ahí.
Para solucionarlo cambia strcat por strcpy que copia desde el principio de la cadena.
Por otra parte: es de mala práctica esconder puntero detrás de un typedef. Mejor si dejas los punteros vistos.