• 库函数memcpy()与memmove()实现


    原文:http://www.cppblog.com/zenliang/articles/131782.html

    根据MSDN文档,当源区域与目标区域存在重叠时,memcpy()函数报错,而memmove()函数可以处理重叠情况!

     1/* 
     2 * 函数名: memcpy 
     3 * 功  能: 从源source中拷贝n个字节到目标destin中 
     4 * 用  法: void *memcpy(void* destin, const void* source, size_t n); 
     5 * 说  明: 内存拷贝
     6*/

     7
     8#include <stdio.h> 
     9#include <conio.h>   //getch头文件
    10#include <assert.h>  //assert头文件
    11
    12typedef unsigned char byte
    13//typedef unsigned int size_t;
    14
    15
    16/*
    17memcpy函数,如果内存重叠则报错
    18*/

    19//src要保留
    20void* memcpy(void* dst,const void* src,size_t count) 
    21{
    22    byte* pbTo = (byte*)dst; 
    23    byte* pbFrom = (byte*)src; 
    24    assert(dst!= NULL && src != NULL);//不能存在空指针
    25    assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止内存重叠(overlap) 
    26    while (count-- > 0) 
    27    
    28        *pbTo++ = *pbFrom++; 
    29    }
     
    30    return dst; 
    31}

    32
    33/*
    34memmove函数,考虑了内存重叠的情况
    35*/

    36//src可以不保留
    37void* memmove(void* dst,const void* src,size_t count) 
    38{     
    39    byte* pbTo = (byte*)dst; 
    40    byte* pbFrom = (byte*)src; 
    41    assert(dst != NULL && src != NULL);//不能存在空指针
    42    if (dst <= src || pbTo >= pbFrom + count)// 
    43    
    44        while (count-- > 0) 
    45        
    46            *pbTo++ = *pbFrom++; //按递增拷贝
    47        }
     
    48    }
     
    49    else  //
    50    
    51        pbTo = pbTo + count -1;//overlap的情况,从高位地址向低位拷贝 
    52        pbFrom = pbFrom + count -1; 
    53        while (count-- > 0) 
    54        
    55            *pbTo-- = *pbFrom--; //按递减拷贝
    56        }
     
    57    }
     
    58    return dst; 
    59}
  • 相关阅读:
    Angularjs中文教程
    IE兼容性 css处理常见
    手写画板实现并转化成图片
    canvas 最基本简单的示例
    凡科 网站地址
    IOS学习之路二十二(UIAlertView获得文本框内容及添加北京图片)
    IOS学习之路十四(用TableView做的新闻客户端展示页面)
    IOS开发之路二十一(UIWebView加载本地html)
    iOS学习之路十三(动态调整UITableViewCell的高度)
    IOS学习之路十二(UITableView下拉刷新页面)
  • 原文地址:https://www.cnblogs.com/black/p/2793224.html
Copyright © 2020-2023  润新知