天天看點

模拟實作memcpy和memmove函數

模拟實作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;

}

運作結果:

模拟實作memcpy和memmove函數

剛剛說,memcpy函數不能處理有記憶體重疊的情況,我們來測試一下

模拟實作memcpy和memmove函數

上面,我們想把1234拷到4567的位置,預想結果是1234123489,然而我們測試結果确是123123189,這是怎麼回事呢?看圖說明

模拟實作memcpy和memmove函數

綜上,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;

}

運作結果:

模拟實作memcpy和memmove函數

結果分析:

模拟實作memcpy和memmove函數

是以說,memmove函數和memcpy函數主要差別就是,memmove函數能夠處理記憶體有重疊的情況,而memcpy則不能。

繼續閱讀