• memcpy与memmove


    函数原型:

    void* memcpy(void *dst,void const *src,size_t count)  
    void* memmove(void *dst,void const *src,size_t count)  
    

    头文件:

    #include<string.h>
    

    引入:

      字符串由''结尾,所以字符串内部不能包含任何''字符(''的ASCII值为0),否则我们将读不到''后的字符内容。但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据。所以,我们要引入内存操作的函数来处理。

      memcpy

    memcpy函数是从src的起始位置复制count个字节到dst内存的起始位置。

    我们可以利用这种方法复制任何类型的数值,但是,如果src和dst以任何形式出现了重叠,它的结果就是未定义的。所以,有内存重叠的情况时,我们要避免使用memcpy函数。

    //模拟memcpy源码实现  
    void* my_memcpy(void *dst, void *src, size_t count)  
    {  
        assert(dst);     //这里最好检测一下源和目的的合法性
        assert(src);  
        char *dest = (char *)dst;    //以字节为单位进行复制
        char *str = (char *)src;  
        while (count--)  
        {  
            *dest++ = *str++;  
        }  
        return dst;  
    }  
    

      memmove

    memmove函数和memcpy函数差不多,只是它的源和目标操作数可以重叠。

    //模拟memmove源码实现  
    void* my_memove(void *dst, void *src, size_t count)  
    {  
               assert(dst);  
               assert(src);  
               char *dest = (char *)dst;  
               char *str = (char *)src;  
    
               if ((dest > str) && (dest < str + count))  
               {    // 内存重叠,从后往前拷贝
                 dest = dest + count - 1;  
                 src  = src + count - 1;  
      
                 while (count--)   
                 {  
                    *dest-- = *str--;  
                  }  
               }  
               else  
               {  //内存不重叠,相当于memcpy
                        while (count--)  
                        {  
                                  *dest++ = *str++;  
                        }  
               }  
               return dst;  
    }  
    

      

  • 相关阅读:
    springmvc 路由
    springMVC 流程
    SqlServer中Sql语句的逻辑执行顺序
    中小型公司静态资源管理部署方案
    浅谈SQL Server中的三种物理连接操作
    Zclip复制页面内容到剪贴板兼容各浏览器
    C#中如何利用操作符重载和转换操作符
    类型构造器(静态构造函数)的执行时机你知道多少?
    容器云技术选择之kubernetes和swarm对比
    kafka入门
  • 原文地址:https://www.cnblogs.com/Lynn-Zhang/p/5595304.html
Copyright © 2020-2023  润新知