memset、memcpy
memcpy与memmove的区别
memcpy是不作预处理的内存复制,直接由低位到高位复制。
memmove是做处理的内存复制: 当src 高于 test时,从低位到高位复制;当src低于test时,从高位到地位复制;当src等于test时,不做任何处理。
当两个内存没有重叠的部分时,两个函数的作用没有区别,但是当有内存重叠的时候,memmove更为安全。
如,有字符串为“abcdefgh”,src指向a,test指向c。如果按照由低到高(由左到右)的复制时,a复制给c,b复制给d,但是当取src中的第三位时,本意是想取c,但是由于之前a复制给c了,所以这里只能取到a。整体地说,没有语法错误,但是会出现逻辑错误。
总结:memmove,当src高于test时,和memcpy处理一样,从低位到高位(由左到右)的复制;当src低于test时,从高位到低位(由右到左)的复制,当src等于test时,不做任何处理。
具体代码示例:
void *Mymemcpy(void * test,const void * src,size_t n)
{
if(src == NULL) return src;
char *p = (char *)test;
const char *q = (const char *)src;
while(n--)
* p++ = *q++;
return test;
}
void *Mymemmove(void *test,const void *src,size_t n)
{
if(src == NULL) return src;
char *p = (char *)test;
const char *q = (const char *)src;
if(q > p)
{
while(n--)
*p ++ = *q++;
}
else if(q < p)
{
p = p+n-1;
q = q+n-1;
while(n--)
*p-- = *q--;
}
return test;
}
注意:在windows系列中做memcpy和memmove实验没有差别,需要到linux系统试验。