salut, tout d'abord s2 est un pointeur sur un const char. Donc sizeof s2 te donne la taille du pointeur ie 4octets et non la taille de ta chaine (si c'est vrai, le compilateur n'est pas normé iso, ce n'est pas le comportement de sizeof sinon il n'y aurait pas de strlen).
Ensuite, si tu alloues de la mémoire dans la fonction my_strcpy, ben malloc te retourne un pointeur local et donc quand tu sors de ta fonction, ton pointeur local est perdu et donc d'ou le segmentation fault. Le malloc est fait par l'utilisateur et non dans la fonction strcpy.
Ensuite strcpy retourne le pointeur sur un char ie char* et non un char. Ta fonction devrait etre:
char*
my_strcpy (char* dest, const char* src) {
int i;
for (i = 0; src[i]!='\0'; ++i)
dest[i] = src[i];
dest[i] = '\0';
return dest;
}


