转载 [memcpy、memset、memmove、memcmp、memchr源码实现 ]

memcpy、memset、memmove、memcmp、memchr源码实现  

各个函数声明如下:

void * memcpy ( void * destination, const void * source, size_t num );
功能:将以source作为起始地址的数据复制num个字节到以destination为起始地址的数据中,不支持destination和source重叠的情况。函数返回destination指针。
 
void * memset ( void * ptr, int value, size_t num );
功能:将以ptr作为起始地址的数据的num个字节设置为value。函数返回destination指针。
 
void * memmove ( void * destination, const void * source, size_t num );
功能:功能:将以source作为起始地址的数据的num个字节移动到以destination为起始地址的数据中,支持destination和source重叠的情况。函数返回destination指针。
 
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:比较以ptr1为起始地址数据和以ptr2为起始地址的数据的num个字节大小情况。如果num个字节都相等,则相等,函数返回0。从起始位置开始,如果某个字节大,则prt1>ptr2,函数返回正数,否则ptr<ptr2,函数返回负数。
 
void * memchr (void * ptr, int value, size_t num ); 
功能:在以ptr作为起始地址的数据中的num个字节中查找value,如果查到,则返回value所在的地址,否则返回NULL.
 
 
具体实现如下:

void* memcpy (void* destination,constvoid* source,size_t num )
{
char* pdes =(char*)destination;
char* psrc =(char*)source;
assert(destination !=NULL && source !=NULL && num>0);
while(num--)
*pdes++=*psrc++;
return destination;
}

void* memmove (void* destination,constvoid* source,size_t num )
{
char* pdes =(char*)destination;
char* psrc =(char*)source;
assert(destination !=NULL && source !=NULL && num>0);
//判断destination和source是否存在重叠
if(pdes+num <psrc || psrc+num < pdes)//不存在重叠,正常从前向后复制
while(num--)
*pdes++=*psrc++;
else//存在重叠,防止信息丢失,从后向前复制
{
pdes = pdes+num-1;
psrc = psrc+num-1;
while(num--)
*pdes--=*psrc--;
}
return destination;
}
void* memset (void* ptr,int value,size_t num )
{
char* ptmp =(char*)ptr;
assert(ptr !=NULL && num >0);
while(num--)
*ptmp++= value;
return ptr;
}
int memcmp (constvoid* ptr1,constvoid* ptr2,size_t num )
{
int ret =0;
constchar* ptmp1 =(char*)ptr1;
constchar* ptmp2 =(char*)ptr2;
assert(ptr1 != NULL && ptr2 != NULL && num>0);
while(num--)
{
if(*ptmp1 >*ptmp2)
{
ret =1;
break;
}
if(*ptmp1 <*ptmp2)
{
ret =-1;
break;
}
ptmp1++;
ptmp2++;
}
return ret;
}

void* memchr (void* ptr,int value,size_t num )
{
char* pret = NULL;
char* ptmp =(char*)ptr;
assert(ptr !=NULL && num>0);
while(num)
{
if(*ptmp == value)
{
pret = ptmp;
break;
}
ptmp++;
num--;
}
return pret;
}

原文:http://weishi2007.blog.163.com/blog/static/20417950201272651852433/

posted on 2013-09-04 10:00  springcoming  阅读(373)  评论(0)    收藏  举报