前面文章问题继续,之所以2个函数效果一样,我怀疑是编译器的问题,或者库函数已经对memcpy做了修改。如果按照
void *memcpy1(void* dest,void* src,size_t size)
{
char* tmpDest = (char*)dest; //取首地址
char* tmpSrc = (char*)src; //取首地址
while(size--)
*tmpDest++=*tmpSrc++;
return dest;
}
uint8_t arr[5] = {1,2,3,4,5};
int main(void)
{
G_print(arr,5);
memcpy1(&arr[2],&arr[1],3);
G_print(arr,5);
return 1;
}
这样的库函数测试的话 结果是:
01 02 03 04 05
01 02 02 02 02
[Finished in 0.8s]
参考:https://mp.weixin.qq.com/s/2ZJ0WVDrao_3AuyQznmefA
strcpy和memcpy都是标准库c的函数;
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且还会复制字符串的结束符'\0'。
原型:char* strcpy(char* dest,const char* src);
memcpy提供了内存的复制。即对于复制的内容没有限制,因此用途更广。
原型: void* memcpy(void* dest,const void* src,size_t size);
实现strcpy
char* strcpy(char* dest,const char* src)
{
assert(dest!=NULL&&src!=NULL);
char* tmp = dest; //取首地址
while((*dest++=*src++)!='\0');
return tmp;
}
实现memcpy
void *memcpy(void* dest,void* src,size_t size)
{
assert(dest!=NULL&&src!=NULL);
char* tmpDest = (char*)dest; //取首地址
char* tmpSrc = (char*)src; //取首地址
while(size--)
*tmpDest++=*tmpSrc++;
return dest;
}
另外memcpy有一个缺点,无法处理内存重叠的问题,(当src首地址在dest首地址之前,且src和dest有内存重叠的部分,memcpy会出现提前覆盖src和dest重叠的内存)
memmove也是c语言的库函数,和memcpy唯一的区别就是当内存发生重叠时,可以保证src在被覆盖之前将重叠区域的字节拷贝到目标区域中。
实现memmove
void *memmove(void* dest,void* src,size_t size)
{
assert(dest!=NULL&&src!=NULL);
char* tmpDest = (char*)dest; //取首地址
char* tmpSrc = (char*)src; //取首地址
if(tmpSrc<tmpDest && tmpSrc+size>tmpDest)
{
tmpDest = tmpDest+size-1;//首地址改为尾地址
tmpSrc = tmpSrc+size-1;//首地址改为尾地址
while(size--)
*tmpDest-- = *tmpSrc--; //倒着复制
}
else
{
while(size--)
*tmpDest++=*tmpSrc++;
}
}