zoukankan      html  css  js  c++  java
  • memset、memcpy

     memcpy与memmove的区别
        memcpy是不作预处理的内存复制,直接由低位到高位复制。
        memmove是做处理的内存复制:  当src 高于 test时,从低位到高位复制;当src低于test时,从高位到地位复制;当src等于test时,不做任何处理。
     当两个内存没有重叠的部分时,两个函数的作用没有区别,但是当有内存重叠的时候,memmove更为安全。
    如,有字符串为“abcdefgh”,src指向a,test指向c。如果按照由低到高(由左到右)的复制时,a复制给c,b复制给d,但是当取src中的第三位时,本意是想取c,但是由于之前a复制给c了,所以这里只能取到a。整体地说,没有语法错误,但是会出现逻辑错误。
     
    总结:memmove,当src高于test时,和memcpy处理一样,从低位到高位(由左到右)的复制;当src低于test时,从高位到低位(由右到左)的复制,当src等于test时,不做任何处理。
     
    具体代码示例:
    void *Mymemcpy(void * test,const void * src,size_t n) 
    {
    if(src == NULL) return src;
    char *p = (char *)test;
    const char *q = (const char *)src;
    while(n--)
    * p++ = *q++;
    return test;
    }

    void *Mymemmove(void *test,const void *src,size_t n)
    {
    if(src == NULL) return src; 
    char *p = (char *)test;
    const char *q = (const char *)src;
    if(q > p)
    {
    while(n--)
            *p ++ = *q++;
    }
    else if(q < p)
    {
    p = p+n-1;
    q = q+n-1;
    while(n--)
    *p-- = *q--;
    }
    return test;
    }
     
      注意:在windows系列中做memcpy和memmove实验没有差别,需要到linux系统试验。
  • 相关阅读:
    [LeetCode]10. Regular Expression Matching
    [LeetCode]9. Palindrome Number
    [LeetCode]8. String to Integer (atoi)
    javascript 内部函数的定义及调用
    canvas和白鹭引擎中平移,旋转,缩放
    改变this指向的call,apply,bind方法
    关于JavaScript中this小有理解
    关于位运算符的计算法方法
    制作简单的GIF动图
    HTML中的单位小结
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2390138.html
Copyright © 2011-2022 走看看