zoukankan      html  css  js  c++  java
  • 小总结----memcpy()的实现

     对memcpy的理解和小总结

    原型:void *memcpy(void *dest, const void*src, size_t len)

    别bb,直接看source code.
    source code:

     1 void *my_memcpy(void *mpTo, const void*mpFrom, size_t len)
     2 {    
     3   if((NULL == mpFrom) || (NULL == mpTo))    //用来判断字符是否有效
     4   {
     5   return NULL;    //如果字符无效就返回
     6   }
     7 
     8/**************** 看提醒,理解为啥这样干 ************/
     9   unsigned char *tempFrom = (unsigned char*)mpFrom; 
    10   unsigned char *tempTo = (unsigned char*)mpTo;    
    11 /****************************************************/
    12 
    13   while(len--)
    14   {
    15     *tempTo++ = *tempFrom++;    
    16   }
    17   return tempTo;
    18 }


    memcpy函数功能:
    ①memcpy函数拷贝n个字节从内存中的src到dest的内存区域中。内存区域不能有重叠,如果有重合,要使用memmove函数。

    ② memcpy 函数用于 把需要拷贝的内存(mpFrom所指向的内存区域) 拷到需要内存(mpTo所指向的内存区域);len变量是用来表示拷贝多少字节,一般会使用sizeof,或者strlen计算出len的值,两种方法这也是需要注意的一个重点, clearly! just a '/0'.

     

    用法:可以拷贝任何类型的对象,因为函数的参数类型是void*(任意类型指针).

    提醒:
    ①:如果直接进行*mpFrom++ = *mpTo++; 这样就是对void的指针进行算法操作,这是错误的做法!!!
    ②:函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为 unsigned char*,这样在指针加的时候才会保证每次加一个字节.

    函数使用方法:

     1 int main(int argc, char** argv)
     2 {
     3     const char src[] = "mk";    
     4     char dest[] = "abcdef";
     5 
     6     my_memcpy(dest, src, strlen(src));
     7     printf("%s
    ", dest);    //mkcdef
     8 
     9     return 0;
    10 }

    注意:

    ①使用sizeof和strlen的区别:''.具体的sizeof和strlen不多说.

    如果使用sizeof计算len;如下:

     1 int main(int argc, char** argv)
     2 {
     3     const char src[] = "mk";
     4     char dest[] = "abcdef";
     5 
     6     my_memcpy(dest, src, sizeof(src));
     7     printf("%s
    ", dest); //mk
     8 
     9     return 0;
    10 }


    ②void*一定要有一个返回值,和void是不一样的.

     所以原型不要写错成:

    void my_memcpy(void *mpTo, const void*mpFrom, size_t len)

    ③再次提醒:如果直接进行*mpFrom++ = *mpTo++; 这样就是对void的指针进行算法操作,这是错误的做法!!!

  • 相关阅读:
    08 linux文件检索和编辑
    Mybatis3详解(二十)——Mybatis中使用的9种设计模式(转)
    Mybatis3详解(十八)——Mybatis运行原理之Mapper接口的动态代理过程
    Mybatis3详解(十七)——Mybatis运行原理之SqlSession的构建过程
    Mybatis3详解(十六)——Mybatis运行原理之SqlSessionFactory的构建过程
    Mybatis3详解(十五)——Mybatis整合Spring框架
    Mybatis3详解(十四)——Mybatis的分页
    Mybatis3详解(十三)——Mybatis逆向工程
    Mybatis3详解(十二)——Mybatis缓存
    Mybatis3详解(十一)——延迟加载
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5046784.html
Copyright © 2011-2022 走看看