函数作用:从sourse的位置开始向后复制num个字节到desttintion指向的内存位置,(运用于字符时,遇到\0不会停止),这个函数支持重叠部分的复制,是memcpy函数的改进版本
具体步骤:
1:函数定义:
需要两个指针,分别指向起始位置和目标空间位置,还有复制的字节数(字节数,不是元素个数)
返回值是目标位置的起始位置
2:因为可以复制重叠部分,所以需要进行判断
这里我用同一个数组进行举例
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1)如果dest<str,按照普通的步骤进行就可以完成任务
2)如果dest>str,按照顺序就会发生错误
如果从后往前进行拷贝,可以避免这种结果
3:最后进行代码优化
str指向的空间是不用进行修改的,所以指针用const修饰,防止传进去空指针,用assert函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <assert.h>
#include <stdio.h>
#include <string.h>
void* my_memmove(void* dest, const void* str, size_t num)
{
void* ret = dest;
assert(dest && str);
if (dest <= str)
{
while (num--)
{
*(char*)dest = *(char*)str;
dest = ((char*)dest)++;
str = ((char*)str)++;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)str + num);
}
}
return dest;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10};
my_memmove(arr+3, arr , 20 );
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}