memmove
重叠内存拷贝
库函数声明
void * memmove ( void * destination, const void * source, size_t num );
从source的位置开始向后复制num个字节的数据到destination的内存位置
使用
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
my_memmove自我实现
思路解析:
1 2 3 4 5 6 7 8 9 10
3 4 5 6 7(来源:src指向3)
1 2 3 4 5(目的地:dest指向1)
3 4 5 6 7 6 7 8 9 10(预期结果)
从前向后拷贝
3->1
4->2
...
7->5
一个一个拷贝:从前向后拷贝
1 2 3 4 5 6 7 8 9 10
3 4 5 6 7(来源:src指向3)
6 7 8 9 10(目的地:dest指向6)
1 2 3 4 5 3 4 5 6 7(预期结果)
从后向前拷贝
7->10
6->9
...
3->6
一个一个拷贝:从后向前拷贝
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest < src)
{
//从前向后拷贝
while (count--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
//后->前
while (count--)
{
*((char*)dest + count) = *((char*)src+count);
}
}
return ret;
}
int main()
{
int arr[] = { 1, 2 ,3, 4 ,5 ,6, 7, 8, 9, 10 };
int i = 0;
//前->后
my_memmove(arr, arr + 2, 5 * sizeof(int));
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
/*
//后->前
my_memmove(arr+5, arr+2, 5*sizeof(int));
for (i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
*/
return 0;
}