• 小总结----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的指针进行算法操作,这是错误的做法!!!

  • 相关阅读:
    Leetcode 233 Number of Digit One
    获取各种常见形状的位图
    关于编程
    LintCode-第k大元素
    基于IBM Bluemix的数据缓存应用实例
    LeakCanary:简单粗暴的内存泄漏检測工具
    MFC,C++,VC++,VS2010 之间究竟是什么关系
    我对高考考场制度(比方是否同意迟到、忘带考证、上厕所)优化的点滴思考,不一定非常有道理
    ural 1989(树状数组+多项式hash)
    TI C66x DSP 系统events及其应用
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5046784.html
Copyright © 2020-2023  润新知