Назначение строки следующим образом:
char *s="SourceString";
использует память только для чтения, поэтому изменение содержимого приведет к неопределенному поведению. Использование массивов, вероятно, будет работать так, как вы думали.
char s[]="SourceString";
char t[]="TargetString";
В вашем примере вы просто играете с локальными переменными, которые уничтожаются при возврате функции strcpy.
Вы можете попробовать что-то вроде этого:
void strcopy2(char **s, char **t) //<--- pointers to pointers, ouch!
{
*t = *s; //<--- Assign the value of the pointer who's address was passed.
}
int main(void)
{
char *s = "SourceString";
char *t = "TargetString";
printf("%s\n", s);
strcopy2(&s, &t); //<--- pass address of pointers!
printf("%s\n", t);
}
Я предпочитаю использовать массивы char, хотя я манипулирую строками.