linux中strcpy、memcpy的用法与区别

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个字符用来存放结束符。如果不晓得这点的话,用户编写的程序也可能打印出来的是很长的字符串或是末尾携带一些乱码了。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值