C/C++ memmove与memcpy的区别及实现
发布时间:2020-12-16 09:08:07 所属栏目:百科 来源:网络整理
导读:1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。 memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至' '停止。 2.函数说明:???????? memcpy函数的功能是从源src所指的
1.与字符串函数strcpy区别:
2.函数说明:????????
3.拷贝情况: ????? 拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况: ????? 1.当src内存区域和dst内存区域完全不重叠 ???? 2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前 ???? 3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前 ? ?????上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。 4.代码实现 memcpy: void* _memcpy(void* dest,const void* src,size_t count)
{
assert(src != nullptr&&dest != nullptr);
//判断dest指针和src指针是否为空,若为空抛出异常
char* tmp_dest = (char*)dest;
const char* tmp_src = (const char*)src;
//将指针dest和指针src由void强转为char,
//使得每次均是对内存中的一个字节进行拷贝
while (count--)
*tmp_dest++ = *tmp_src++;
return dest;
}
memmove: void* _memmove(void* dest,size_t count)
{
assert(src != nullptr&&dest != nullptr);
//判断dest指针和src指针是否为空,若为空抛出异常
char* tmp_dest = (char*)dest;
const char* tmp_src = (const char*)src;
if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝
while (count--)
*tmp_dest++ = *tmp_src++;
else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝
{
tmp_src += count - 1;
tmp_dest += count - 1;
while (count--)
*tmp_dest-- = *tmp_src;
}
//else(tmp_src==tmp_dest) 此时不进行任何操作
return dest;
}
转载于https://www.cnblogs.com/lyl-312/p/5514988.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |