Estimado Jose,
con todo el cariño del mundo, ese código que has puesto generaría un GPF
La razón es simple, el compilador de C ha reservado memoria para los bytes que le has indicado en la primera cadena:
char destino[] = "Saludos ";
es decir tiene un total de 9 bytes (8 bytes más el byte cero de terminación de cadena). Además de eso, esa memoria no es "dinámica" por lo que solo debe ser de lectura, pero bueno, eso puede aceptarse.
El problema es que cuando tu hagas strcat() vas a intentar meterle un total de "amigos de FWH" 14 bytes (13 más el byte para el cero) y obviamente eso no cabe en los 9 bytes de "destino", lo cual va a provocar un GPF porque te sales de lo que mide esa memoria.
Como se resuelve esto ?
1. Tienes que darle espacio suficiente a la primera cadena para que acepte una concatenación de la segunda. Asi como la primera mide 9 y vamos a meterle 14 bytes más, pues al menos deberiamos declarar:
char destino[ 23 ];
ahora incializariamos esa cadena con su contenido inicial:
strcpy( destino, "Saludos " );
asi ya tenemos "Saludos " dentro de esa variable y además tenemos espacio para lo que le vamos a añadir ahora, haciendo:
strcat( destino, origen );
y efectivamente como dices, strcat() devuelve el puntero (que apunta al comienzo de "destino") y puedes imprimirlo directamente, etc
El C es una maravilla, prueba de ello es Harbour que está programado integramente en C, pero conocer bien estos detalles es lo que hace que nuestro codigo sea sólido y estable como una roca
un abrazo