strcpy提供了字符串的复制,以 \0 为结束标志(即一旦遇到数据值为0的内存地址,拷贝过程即结束)。

函数原型如下:

char *strcpy(char *dest, const char *src);

其在内核(lib\string.h)源代码的实现如下:

char *strcpy(char *dest, const char *src)

{

char *tmp = dest;

while( (*dest++ = *src++) != '\0' );

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;
 }


strcpy和memcpy主要有以下3个方面的区别。
1、复制的内容不同。 strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。 strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
不难看出,如果你用来复制字符串, memcpy复制的最后并没有给目的字符串dset赋结束符'\0'(由用户的源字符串长度和内容决定)。假如用户源字符串很长,而只需复制一段给目标dest串,因此如果用户要打印复制的结果,那么最后的一步操作就是给dest[count]='\0'。然而这时用户的设置的目的串要足够大,至少比count大1个字符用来存放结束符。如果不晓得这点的话,用户编写的程序也可能打印出来的是很长的字符串或是末尾携带一些乱码了。


Logo

更多推荐