strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
strcpy的原型为:
char *strcpy(char *dest, const char *src)
其在内核源码中(lib/string.h)的实现如下:
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0');
/* nothing */;
return tmp;
}
即最关键的一点是用到了如下的循环
while ((*dest++ = *src++) != '\0');
这就是为什么用此复制字符串是会出现异常终止的现象。也可以看出strcpy最终是给目的串的末尾赋了结束符'\0'的。
而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么,根据定义可知不仅限于字符之间的操作。
memcpy的原型为:
void *memcpy(void *dest, const void *src, size_t n);
其在内核源码中(lib/string.h)的实现如下:
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}
不难看出,如果你用来复制字符串,memcpy复制的最后并没有给目的字符串dset赋结束符'\0'(由用户的源字符串长度和内容决定)。假如用户源字符串很长,而只需复制一段给目标dest串,因此如果用户要打印复制的结果,那么最后的一步操作就是给dest[count]='\0'。然而这时用户的设置的目的串要足够大,至少比count大1个字符用来存放结束符。如果不晓得这点的话,用户编写的程序也可能打印出来的是很长的字符串或是末尾携带一些乱码了。