• memcopy 和 memmove 的实现


    一 memcopy 的实现

    memcopy 不考虑源内存和目标内存之间的重叠, 逐字节地拷贝, 代码比较简单

    C代码 

    • void my_memcopy(void *src, void *dst, int size)  
    • {  
    • char *psrc, *pdst;  
    •     psrc = (char *)src;  
    •     pdst = (char *)dst;  
    • while (size--) {  
    •         *pdst++ = *psrc++;  
    •     }  
    • }  

    二 memmove 的实现

    memmove 要考虑源内存和目标内存之间的重叠, 概括起来, 有 3 种情况:

    (1) src 和 dst 没有重叠, 其充要条件是 |src - dst| <= size, 如下图所示:

    (2) src 和 dst 有重叠, 而且 dst < src dst src src - dst size p>

    (3) src 和 dst 有重叠, 而且 src< dst src dst dst - src size p>

    对于第 (1) 和第 (2) 中情况, 可以这样移动数据: 从 src 开始, 由低地址向高地址逐字节拷贝.

    对于第 (3) 中情况, 则必须这样移动数据: 从最后一个字节 (src + size -1) 开始, 由高地址向低地址逐字节拷贝.

    代码如下:

    C代码 

    • void my_memmove(void *src, void *dst, int size)  
    • {  
    • char *psrc, *pdst;  
    •     psrc = (char *)src;  
    •     pdst = (char *)dst;  
    • if (pdst < psrcpdst-psrc> size) {  
    • while (size--) {  
    •             *pdst++ = *psrc++;  
    •         }  
    •     } else {  
    •         psrc = psrc + size - 1;  
    •         pdst = pdst + size - 1;  
    • while (size--) {  
    •             *pdst-- = *psrc--;  
    •         }  
    •     }  
    • }  
  • 相关阅读:
    alpha冲刺—Day5
    alpha冲刺—Day4
    alpha冲刺—Day3
    alpha冲刺—Day2
    alpha冲刺—Day1
    团队作业第五次—alpha冲刺博客汇总
    团队作业第四次—项目系统设计与数据库设计
    团队作业第三次—项目需求分析
    团队作业第二次—团队Github实战训练
    win10配置java环境变量,解决javac不是内部或外部命令等问题
  • 原文地址:https://www.cnblogs.com/fuyou/p/3233298.html
Copyright © 2020-2023  润新知