c语言----memcpy
2011-06-01 16:43 Jeff 阅读(663) 评论(0) 编辑 收藏 举报
搜索了网上关于,memcpy的使用方法,很多都提到,目标地址和源地址不能有重复.一般目标地址和源地址有重复时使用memmov.但是我们的环境中即使目标地址和源地址重复依然可以用memcpy.
网上说VC也是不支持地址重复,但是我用codeblock可以使用,用的是mingw32.
copy不能有重复的内存实现:
void * __cdecl memcpy (void * dst,const void * src,size_t count) { void * ret = dst; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret); }能copy有重复内存的实现:
void *MemCopy(void *dest,const void *src,size_t count) { char *pDest=char * (dest); const char *pSrc=const char *(src); if( pDest > pSrc && pDest < pSrc+count ) //反向 { for(size_t i = count-1;i > =0;--i) { pDest[i]=pSrc[i]; } } else { for(size_t i=0; i < count; ++i) { pDest[i]=pSrc[i]; } } return pDest; }memmove的实现:
void *Memmove(void *Dst, const void*Src,size_t count) { void* pDst = Dst; if (Dst < Src||(char*)Dst > (char*)Src + count) //正向copy { while(count--) { *(char*)Dst = *(char*)Src; Dst = (char*)Dst + 1; Src = (char*)Src + 1; } } else //反向copy { Dst = (char*)Dst + count - 1; Src = (char*)Src + count - 1; while(count--) { *(char*)Dst = *(char*)Src; Dst = (char*)Dst -1 ; Src = (char*)Src -1 ; } } return pDst; }