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