函数介绍:
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
函数的实现原理以及如何处理重叠内存块的情况。这也是我们在编程中经常会遇到的一种需求,因此了解其实现原理对于提高我们的编程能力是非常有帮助的。