最近在看 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开辟十个长度的空间就不会发生这个错误。