C语言比较重要的库函数memcpy memmove和内存重叠的问题

下面重点来讲解memcpy和memmove的区别:
这两个函数的函数原型(除了名字)是一样的:
void *memcpy(void *dst, const void *src, size_t count):
void *memmove(void *dst, const void *src, size_t count);
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)

 

即:dst<=src 且 dst+count>src


即:src<dst且src+count>dst


下面将针对这两种情况来讨论。针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);结果是:
4567896789

 

针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};


memcpy(a+4, a, sizeof(int)*6)

 

memmove(a+4, a, sizeof(int)*6)

 

memmove可能的实现(非库函数实现,自己的实现):

<span style="font-family:Microsoft YaHei;font-size:14px;">void *memmoveMy(void *dst, const void *src, size_t count)
{
       assert((dst != NULL) && (src != NULL) );
       char *tmpdst = (char *)dst;
       char *tmpsrc = (char *)src;
   
       if (tmpdst <= tmpsrc || tmpdst  >= tmpsrc + count)
      {
            while (count --)
           	*tmpdst++ = *tmpsrc++;
       }
      else
      {
           tmpdst = tmpdst  + count - 1;
           tmpsrc = tmpsrc  + count - 1;
           while (count --)
          	*tmpdst-- = *tmpsrc--;
       }
       return dst;
}</span>


转自:http://blog.csdn.net/liuchanghe/article/details/1362629

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值