实现自己的strcpy函数是遇到的问题

最近在看 C和指针 在做第9章第3个编程题时,遇到了一个奇怪的问题,原题如下
编写一个名叫my_strcpy的函数,它类似于strcpy函数,但它不会溢出目标数组。复制的结果必须是一个真正的字符串。

我在centos上编写了程序:
 #include <stdio.h>

char *my_strcpy(char *buff, const char *str, int buffLen)
{
    char *temp = buff;

    while ((temp < buff + buffLen) &&  (*str != '\0'))
    {
            *(temp++) = *(str++);
    }
    *(temp) = '\0';

        return buff;
}

int main(int argc, char **argv)
{
    char buff[10];
    const char *str = "hello world";
    printf("%p\n", str);

    my_strcpy(buff, str, 10);
      printf("%p\n", str);
    printf("buff:%s\nstr:%s\n", buff, str);
    printf("length of buff is : %d\n", strlen(buff));

    getchar();

    return 0;
}

运行时发现str的地址发生了改变, 打印信息如下:
0x80485a4
0x8048500
buff:hello worl
str:
length of buff is : 10

有高手能告诉我为什么上str的地址会发生改变吗?非常感谢。

图片说明
1.好像是一样的,我运行几遍你的代码都没错
2. 字符串复制函数中的两个参数必须保证,前一个参数能够有足够的空间装下后一个参数复制过来的内容,你的程序中buff[10],不能够装下“hello world”共12字符。
3.对于字符串复制函数,有种写法供你参考

 char*strcmp_1(char *p,char*q)
 {
     char*pr=p;
        while(*pr++=*q++);

      *pr='\0';
            return p;
}

你buf空间长度不够啊,不能接受源字符串的所有字符,造成buf溢出了。
strcpy
本身也存在这个问题,所以才会有strncpy。

调用你写的cpy的函数的时候, 由于dest串的长度比src串长度要小, 在copy的时候, 把dest串后面的内存空间写坏了, 导致某个/块内存数据不对了。
从你运行的结果看来, 有可能是src的指针变量的内存被写坏了。

发现用malloc给buff开辟十个长度的空间就不会发生这个错误。