memcpy,strcpy,memset,memmove的函数实现

来源:互联网 发布:光钎网络监控安装教程 编辑:程序博客网 时间:2024/04/30 03:00

【转】memcpy,strcpy,memset,memmove的函数实现

/**********************************************************

公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出)各种情况包括:1、参数是指针,检查指针是否有效2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出3、读写权限检查4、安全检查,是否会溢出

**********************************************************/

/* 功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。*/

void* memcpy(void* dst,const void* src,size_t count)   
{  
    char* pbTo = (char*)dst;   
    char* pbFrom = (char*)src;   
    assert(dst!= NULL && src != NULL);//不能存在空指针  
    assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止内存重叠(overlap)   
    while (count-- > 0)   
    {   
        *pbTo++ = *pbFrom++;   
    }   
    return dst;   
}  

/* 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指

内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。*/

char* strcpy(char* dest, const char* src)

{

    assert(dest != NULL && src != NULL);

   char* address=dest;

   while((*dest++=*src++) != '\0')

   {}

   return address;

}

/* 功能:把buffer所指内存区域的前count个字节设置成字符c。

说明:返回指向buffer的指针。*/

void* memset(void* buffer, int c, int count)

{

     char* pvTo=(char*)buffer;

     assert(buffer != NULL);

     while(count-->0)

     {

         *pvTo++=(char)c;

     }

     return buffer;

}

/*
memmove自定义函数
*/
//src可以不保留  
void* memmove(void* dst,const void* src,size_t count)   
{     
    char* pbTo = (char*)dst;   
    char* pbFrom = (char*)src;   
    assert(dst != NULL && src != NULL);//不能存在空指针  
    if (dst <= src || pbTo >= pbFrom + count)//没有overlap的情况,直接拷贝   
    {   
        while (count-- > 0)   
        {   
            *pbTo++ = *pbFrom++;   
        }   
    }   
    else   
    {   
        pbTo = pbTo + count -1;//overlap的情况,从高位地址向低位拷贝   
        pbFrom = pbFrom + count -1;   
        while (count-- > 0)   
        {   
            *pbTo-- = *pbFrom--;   
        }   
    }   
    return dst;   
}  

原创粉丝点击