码迷,mamicode.com
首页 > 其他好文 > 详细

memcpy与memmove

时间:2016-06-17 23:44:42      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

函数原型:

void* memcpy(void *dst,void const *src,size_t count)  
void* memmove(void *dst,void const *src,size_t count)  

头文件:

#include<string.h>

引入:

  字符串由‘\0‘结尾,所以字符串内部不能包含任何‘\0‘字符(‘\0‘的ASCII值为0),否则我们将读不到‘\0‘后的字符内容。但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据。所以,我们要引入内存操作的函数来处理。

  memcpy

memcpy函数是从src的起始位置复制count个字节到dst内存的起始位置。

我们可以利用这种方法复制任何类型的数值,但是,如果src和dst以任何形式出现了重叠,它的结果就是未定义的。所以,有内存重叠的情况时,我们要避免使用memcpy函数。

//模拟memcpy源码实现  
void* my_memcpy(void *dst, void *src, size_t count)  
{  
    assert(dst);     //这里最好检测一下源和目的的合法性
    assert(src);  
    char *dest = (char *)dst;    //以字节为单位进行复制
    char *str = (char *)src;  
    while (count--)  
    {  
        *dest++ = *str++;  
    }  
    return dst;  
}  

  memmove

memmove函数和memcpy函数差不多,只是它的源和目标操作数可以重叠。

技术分享

//模拟memmove源码实现  
void* my_memove(void *dst, void *src, size_t count)  
{  
           assert(dst);  
           assert(src);  
           char *dest = (char *)dst;  
           char *str = (char *)src;  

           if ((dest > str) && (dest < str + count))  
           {    // 内存重叠,从后往前拷贝
             dest = dest + count - 1;  
             src  = src + count - 1;  
  
             while (count--)   
             {  
                *dest-- = *str--;  
              }  
           }  
           else  
           {  //内存不重叠,相当于memcpy
                    while (count--)  
                    {  
                              *dest++ = *str++;  
                    }  
           }  
           return dst;  
}  

 

  

 

memcpy与memmove

标签:

原文地址:http://www.cnblogs.com/Lynn-Zhang/p/5595304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!