C中自己的memcpy

C语言:#include<string.h> 库中的 memcpy

函数原型
void *memcpy(void*dest, const void *src, size_t n);

功能
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

头文件
#include<string.h>

返回值
  函数返回一个指向dest的指针。

说明
  1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
  2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
  3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
  //注意,source和destin都不一定是数组,任意的可读写的空间均可
————————————————
原文链接:https://blog.csdn.net/tigerjibo/article/details/6841531

 

自己的memory_copy

memory_cpy
// 版本 1  不考虑重叠
void *memcpy(void *dest, const void *src, size_t count)
{
 char *tmp = dest;
 const char *s = src;
 
 while (count--)
    *tmp++ = *s++ ; // 先取出s的内容,后s+1
  
 return dest;
}
//版本 2 考虑重叠
void *memcpy(void *dest, const void *src, size_t count)
{
 char *d;
 const char *s;
 
 if (dest > (src+size)) || (dest < src))
    {
    d = dest;
    s = src;
    while (count--)
        *d++ = *s++;        
    }
 else /* overlap 重叠情况从高位到低位复制*/
    {
    d = (char *)(dest + count - 1); /* offset of pointer is from 0 */
    s = (char *)(src + count -1);
    while (count --)
        *d-- = *s--;
    }
  
 return dest;
}

 考虑重叠

 

void* MemoryCopy(void *dest, const void *src, size_t size)
{
    assert(dest != NULL);
    assert(src != NULL);
    if (src == dest)
        return dest;

    char *d;
    const char *s;

    if ((src > dest) || (src <= (char*)dest - size))
    {
        d = (char*)dest;
        s = (const char*)src;
        while (size--)
            *d++ = *s++;
    }
    else     /* overlap 重叠情况从高位到低位复制   */
    {
        d = (char*)dest + size - 1; 
        s = (const char*)src + size - 1;
        while (size--)
            *d-- = *s--;
    }

    return dest;
}

 

 

posted @ 2019-11-16 12:15  htj10  阅读(235)  评论(0编辑  收藏  举报
TOP