関数strcpyの定義例を読んでいて不思議に思ったのですが、
なぜコピー先の位置を保存しなければならないんでしょうか。

// strcpy
int strcpy(const char *s1 , const char *s2){
char *p = s1; // 位置保存
while(*p++ = *s2++);
return *s1;
}

ちょっとうろ覚えなので、あってるかどうかは自信がないですけど・・・