模拟實作memcpy
思路:
memcpy函數可以實作拷貝功能,但是不能處理有目的和源有記憶體重疊的情況,後面會舉例看到。另外還要考慮特殊情況,指針判空,還有所要使用的變量是否合法,都要進行判斷。
代碼:
//模拟實作memcpy
void *my_memcpy(void*dest, void*src,int i) //i是所要拷貝的位元組數
{
int* d = (int*)dest;
int* s = (int*)src;
if (d== NULL || s == NULL || i< 0)// 不合理情況的處理
{
printf("ERROR");
return;
}
while (i--)
{
*d++ = *s++;
}
}
int main()
{
int i = 0;
int ret = 0;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int s[] = { 11, 22, 33, 44, 55 };
scanf_s("%d",&ret);
int length = sizeof(a) / sizeof(a[0]);
my_memcpy(a, s, ret );
for (i = 0; i < length; i++)
{
printf("%d",a[i]);
}
system("pause");
return 0;
}
運作結果:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFaw1WZ6Z0VlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM5gDM0kTM1EDMxgDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
剛剛說,memcpy函數不能處理有記憶體重疊的情況,我們來測試一下
上面,我們想把1234拷到4567的位置,預想結果是1234123489,然而我們測試結果确是123123189,這是怎麼回事呢?看圖說明
綜上,memcpy不能處理記憶體有覆寫的情況,是以我們在處理記憶體有覆寫的時候,就需要用memmove函數。
模拟實作memmove
思路:
memove函數可以實作拷貝功能,可以處理有目的和源有記憶體重疊的情況。在上面拷貝的時候因為從前往後拷貝的時候,造成了資料被覆寫出現了錯誤,那麼是否可以從後往前拷呢?
代碼:
void* my_memmove(int*dest, int*src, int i, int length)//length是長度,i是拷貝的位元組數
{
int* d = (int*)dest;
int* s = (int*)src;
if (d == NULL || s == NULL || i < 0 )
{
printf("ERROR");
return 0;
}
if (d> s)
{
while (i--)
{
*(d+i) = *(s+i);
}
}
else
while (i--)
{
*d++ = *s++;
}
return d;
}
int main()
{
int ret = 0;
int i = 0;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int length = sizeof(a) / sizeof(a[0]);
scanf_s("%d", &ret);
my_memmove(a + 3, a, ret);
for (i = 0; i < length; i++)
{
printf("%d", a[i]);
}
system("pause");
return 0;
}
運作結果:
結果分析:
是以說,memmove函數和memcpy函數主要差別就是,memmove函數能夠處理記憶體有重疊的情況,而memcpy則不能。