目录
一、介绍
memcpy和memmove和我们所知道的strcpy和strncpy不同,前者是是适用于任何类型的,后者是仅适用于字符串的拷贝。而且strcpy是以‘\0’为结束条件,memcpy和memmove是以参数num来控制。
二、函数的声明
(1) void* memcpy ( void * destination, const void * source, size_t num );
(2) void * memmove ( void * destination, const void * source, size_t num );
1、memcpy是将源source所指向的num个字节的值拷贝到目标destination所指向的内存中。
2、memmove与memcpy的功能基本一致,不同点在于当source指向的空间与destination指向的空间重叠时候,使用memcpy可能会出现问题,而memmove能正确处理。
三、拷贝的情况
情况1️⃣:source与destination所指向的内存完全不重叠
情况2️⃣:有重叠区域,并且destination小于source
情况3️⃣:有重叠区域,并且source大于destination
四、模拟实现
1、memcpy
void* MyMemcpy(void* dest,const void* src,size_t num)
{
assert(dest&&src);
char* dest_tmp=(char*)dest;//目标字符串
const char* src_tmp=(const char*)src;//源字符串
while(num--)
{
*dest_tmp++= *src_tmp++;
}
return dest;返回目标字符串首地址
}
2、memmove
void* my_memmove(void* des, const void* src, size_t num)
{
assert(des && src);
void* ret = des;
char* des_tmp = (char*)des;//目标字符串
const char* src_tmp = (char*)src;源字符串
if (des_tmp <= src_tmp || src_tmp + num < des_tmp)//情况2和情况1
{
while (num--)
{
*des_tmp++ = *src_tmp++;
}
}
else//情况2
{
des_tmp += num - 1;
src_tmp += num - 1;
while (num--)
{
*des_tmp-- = *src_tmp--;
}
}
return ret;返回目标字符串首地址
}
注:在前两种情况下memcpy和memmove的作用完全相同,在情况2下,memvpy会出错,memmove则不会,memcpy可以看做是memmove的一个子集。