函数介绍:
memmove 函数和 memcpy 函数在功能上非常相似,它们都用于在内存中移动一段数据。然而,它们之间有一个关键的区别:memmove 函数可以处理内存重叠的情况,而 memcpy 函数不能处理内存重叠。
首先,我们需要了解memmove函数的原型和功能:
void *memmove(void *dest, const void *src, size_t sz);
头 文 件:#include <string.h>
memmove函数的参数包括目标内存地址dest、源内存地址src以及要复制的字节数sz。函数的返回值为指向目标内存地址的指针。
memmove用法展示:

memmove函数的模拟实现:
使用char类型的指针接收,以字节为单位进行复制。- 判断两个地址的大小,如果起始地址大则从后往前复制,如果起始地址小则从前往后复制
代码展示
void* my_memmove(void* des, const void* src, size_t sz)
{
assert(des && src);
if (des < src)
{
//从前往后
int i = 0;
for (i = 0; i < sz; i++)
{
*(char*)des = *(char*)src;
++(char*)des;
++(char*)src;
}
}
else
{
//从后往前
while (sz--)
{
*((char*)des + sz) = *((char*)src + sz);
}
}
}
示例:
void* my_memmove(void* des, const void* src, size_t sz)
{
assert(des && src);
if (des < src)
{
int i = 0;
for (i = 0; i < sz; i++)
{
*(char*)des = *(char*)src;
++(char*)des;
++(char*)src;
}
}
else
{
while (sz--)
{
*((char*)des + sz) = *((char*)src + sz);
}
}
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 7,8 };
my_memmove(arr1+2, arr1, 16);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}

可以发现和直接调用memmove函数的结果一致。
通过这个例子,我们可以看到memmove函数的实现原理以及如何处理重叠内存块的情况。这也是我们在编程中经常会遇到的一种需求,因此了解其实现原理对于提高我们的编程能力是非常有帮助的。
本文介绍了memmove函数与memcpy的相似性和区别,重点在于memmove能处理内存重叠,通过my_memmove模拟实现和示例说明了其工作原理及其在处理重叠内存时的重要性。

393

被折叠的 条评论
为什么被折叠?



