strcpy、memcpy、memmove的区别

strcpy和memcpy都是标准C库函数,它们有下面特点:

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

strcpy的函数原型是:char* strcpy(char* dest, const char* src);

char *strcpy(char *dest, const char *src)
{
    if((src == NULL) || (dest == NULL))
    {
         return NULL;
    }

    char *strdest = dest; // 保存目标字符串的首地址
    while((*dest++ = *str) != '\0');
    return strdest;
}

memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

memcpy的函数原型是:void *memcpy(void *dest,  const char* src,  size_t count)

void *memcpy(void *memTo, const char *memFrom, size_t size)
{
     if((memTo == NULL) || (memFrom == NULL))
     {
          return NULL;
     }

     char *tempFrom = (char *)memFrom; //保存memFrom的首地址
     char *tempTo = (char *)memTo; //保存memTo的首地址
      while(size-- > 0)
     {
          *tempTo++ = *tempFrom++;
     }
     return memTo;
}

strcpy 和 memcpy主要有以下三方面的区别:

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

 

memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。

当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?

memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。

而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。

例如下面的例子:

int main()
{
char a[] = "123456789";
char *src,*dest;
src = a;
dest = a+1;
strncpy(dest,src,3);
   printf("%s",dest);
}
下面是一段别人的解释,我感觉也很好,所以借鉴一下:

至于重叠的问题在于,源缓冲区可能会被你的函数修改,导致结果不正确
例如我有个20字节的缓冲区,想把最后一个字节给删除,然后把前面的19字节向后移动,
memcpy(buffer+1, buffer, 19)

假如memcpy是这么拷贝的

char * memcpy(const char * src, char * dst, size_t len)
{
      int pos;
      for(pos=0; pos < len; pos ++)
      {
         dst[pos] = src[pos];
      }
      return dst;
}

那么按照他的拷贝顺序,拷贝第一个字节时,等价于buffer[1]= buffer[0],
拷贝第二个字节时,buffer[1]实际已经被buffer[0]覆盖,已经不再是你想拷贝的字符串了


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值