天天看点

memcpy与memmove

函数原型:

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函数差不多,只是它的源和目标操作数可以重叠。

memcpy与memmove
//模拟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;  
}