一:memmove的使?
這是memmove在庫里的定義,具體可在cplusplus.com查看
void * memmove ( void * destination, const void * source, size_t num )
? 和memcpy的差別就是memmove函數處理的源內存塊和?標內存塊是可以重疊的。
? 如果源空間和?標空間出現重疊,就得使?memmove函數處理。
代碼:
include <stdio.h>
#include <string.h>
int main(){ int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr1+2, arr1, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr1[i]); }return 0; }
輸出的結果:1 2 1 2 3 4 5 8 9 1
二:memmove的模擬實現
代碼1:
void*my_memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {dst = (char*)dst + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr+2, arr , 20);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);//1 2 1 2 3 4 5 8 9 10,結果}return 0;
}
代碼2:
函數也可以這樣寫,結果一樣
void* my_memmove(void* arr1, const void* arr2, size_t num)
{if (arr1 < arr2){while (num--){*(char*)arr1 = *(char*)arr2;arr1 = (char*)arr1 + 1;arr2 = (char*)arr2 + 1;}}if (arr1 > arr2){// arr1 = (char*)arr1 + num - 1;// arr2 = (char*)arr2 + num - 1;while (num--){*((char*)arr1+num-1)=*((char*)arr2+num-1);//法1 //取消注釋就是另一種方法// *(char*)arr1 = *(char*)arr2;// arr1 = (char*)arr1 - 1;// arr2 = (char*)arr2 - 1;}}
}