zoukankan      html  css  js  c++  java
  • 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并不是遇到''就结束,而是一定会拷贝完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;
    }

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    SUSE10 SP2/SP3 无规律死机故障解决
    随机铃声
    linux添加开机启动项
    SUSE Linux ShutdownManager issue
    linux添加开机启动项
    两个正在运行的activity之间的通信
    android 获取屏幕大小
    Linux开机启动过程分析
    grid的宽度设为100%问题
    动态处理editGridPanel
  • 原文地址:https://www.cnblogs.com/htj10/p/11871363.html
Copyright © 2011-2022 走看看