实现c中memcpy函数

来源:互联网 发布:植物大战僵尸 for mac 编辑:程序博客网 时间:2024/05/21 17:21

1、memcpy库函数

memcpy函数在C语言中的<string.h>中,在C++的<cstring>中。

函数原型:void * memcpy(void * dest, void * src, size_t num);

功能:将指针src所指向的内存中的num个字节拷贝到dest中去;

库函数中的memcpy没有考虑内存重叠的情况,因此他并不是安全的。


2、函数实现

根据上一篇博客的介绍,指出了memcpy可能会出现“内存重叠”的问题。

没有考虑内存重叠的memcpy函数

void *my_memcpy(void *dest, const void *src, size_t count) //没有考虑内存重叠情况{    assert(dest != NULL && src != NULL);    char *tmp = dest;    const char *s = src;     while (count--)      *tmp++ = *s++;    return dest;}


改进,考虑内存重叠的情况

void * my_memcpy(void *dst,const void *src,unsigned int count)  {       assert(dst != NULL);       assert(src != NULL);       void * ret = dst;       if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝       {           while(count--)           {               *(char *)dst = *(char *)src;               dst = (char *)dst + 1;               src = (char *)src + 1;           }       }       else                       //源地址和目的地址重叠,高字节向低字节拷贝       {            dst = (char *)dst + count - 1;           src = (char *)src + count - 1;            while(count--)            {               *(char *)dst = *(char *)src;               dst = (char *)dst - 1;               src = (char *)src - 1;           }      }      return ret;  }