完成這道題目以前首先要明確memmove是對內存進行操做,因此函數的參數是void *,便可以操做任意類型的數據。windows
其次要明白兩個待處理數據的關係,因而我畫了一張圖幫助你們理解
上面的是特殊狀況,發生內存重疊時只有這種狀況是須要從右向左進行操做的,若是這種狀況仍是按照從左往右操做的話就會把想要拷貝的東西一直重複的拷貝下去,除這種狀況以外都只需從左往右拷貝ide
再而後就是如何實現代碼的過程了,其方法和以前說過的拷貝函數相似,進行值的交換,在這裏就不詳細贅述了。函數
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
void my_memmove(void dst,const void src, int num)
{
void ret = dst;
if (dst > src&&(char )dst <((char ) src + num))//dst包含於src的狀況,從後往前進行操做
{
dst = (char )dst + num - 1;//將dst指向最後一個元素
src = (char )src + num - 1;
while (num--)
{
(char)dst = (char)src;
dst=(char )dst-1;
src=(char)src-1;
}
}
else
{
while (num--)
{
(char)dst = (char)src;
dst = (char )dst + 1;
src = (char)src + 1;
}
}
return (ret);
}
int main()
{
char dst[100] = "hello world";code
my_memmove(dst + 1, dst, strlen(dst) + 1); printf("%s",dst); system("pause"); return 0;
}blog