Ciao, il tuo codice non funziona perchè non hai allocato la memoria temporanea in cui copiare la prima stringa ed allora quando fai il primo strcpy copi la stringa in una posizione a caso nella memoria ram. Per risolvere puoi fare così:
char*cambia(char* a, char* b)
{
char* tmp=malloc(strlen(a)+1);
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
free(tmp);
}
Stai attento che le due stringhe abbiamo la stessa lunghezza prima ri richiamare la funzione, altrimenti si verificherebbe un buffer overflow e scriveresti oltre la fine di una delle due stringhe con risultati inprevedibili.
Io, però, ti consiglio di non utilizzare questo metodo per fare lo swap delle stringhe, ma di procedere in quest'altro modo: scambio tra loro il primo carattere della prima stringa col primo carattere della seconda, poi il secondo carattere della prima col secondo carattere della seconda e così via. In questo modo la funzione occuparà molta meno memoria.
Ciao.