内存函数,memcpy是内存拷贝函数,memmove函数则是内存移动函数,这两个函数的作用差不多,但是区别就在于memmove函数能够反向拷贝,不用在意memcpy函数会遇到的问题。
下面我就具体解释一下memcpy的局限性:
举个例子:给上一个数组arr[] = 1 2 3 4 5 6 7 8 9,;现在你需要将 3 4 5 6拷贝到 5 6 7 8这几个数的位置去。如果你正序拷贝,你会发现将3拷到5的位置,4拷到6的位置,但是你再继续将5拷贝到7的位置的时候,你会发现5已经被改成了3,你再也无法将5拷贝到7的位置了。
下面我再用图片演示一下:
首先指针指的是首地址,当指针指向3的时候
你准备将3拷贝到5的位置
你5拷到7的时候,你会发现5所在的位置,已经被改成了3,这样你再也无法拷贝5这个数字了
这样你就会无法实现将3 4 5 6拷贝到 5 6 7 8。
所以,你需要进行反向的拷贝,就是从6开始向前拷贝,先将6拷到8的位置,再将5拷到7的位置,再将4拷到6的位置,再将3拷到5的位置,这样就不会遇到无法完全拷贝的问题。
你看,每当有你需要拷贝的数字的起始位置将要拷贝到你需要拷贝的位置发生了冲突,也就是将要被拷贝到的位置比将要拷贝数字的位置大,这样你就可以反向拷贝了。
下面我用图片演示一下:
你会看到,将3 4 5 6拷贝到5 6 7 8的位置,也就是
你会发现5所在的位置是大于3所在的位置的,如果是下面这样的
将2 3 4 5拷贝到 6 7 8 9的位置,虽然他们也是符合上面的条件,但是你并不需要将其反向拷贝,但是反向拷贝也不会有什么问题,所以,只要满足上面的这个条件,你就可以反向拷贝。
当然,如果他是正向的,也就是不满足上面的这个条件,你就直接拷贝就行了,和memcpy实现的原理一致。
代码附录如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> void* my_memcpy(void* dest, void* src,size_t n) { void* ret = dest; char* str1 = (char*)dest; char* str2 = (char*)src; assert(dest); assert(src); while (n--) { *str1++ = *str2++; } return ret; } void* my_memmove(void* dest, void* src, size_t n) { void* ret = dest; char* str1 = (char*)dest; char* str2 = (char*)src; assert(dest); assert(src); if (str1 > str2) { while (n--) { *(str1 + n) = *(str2 + n); } } else { while (n--) { *str1++ = *str2++; } } return ret; } 其中,src是指代源,而dest指代的是目标。
测试代码如下:
int main() { int i = 0; int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int arr2[10] = { 0 }; int arr3[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; my_memcpy(arr2, arr1, sizeof(arr1)); my_memmove(arr3 + 5, arr3 + 4, 3 * sizeof(int)); for (i = 0; i < 10; i++) { printf("%d ", arr2[i]); } printf("\n"); for (i = 0; i < 10; i++) { printf("%d ", arr3[i]); } system("pause"); return 0; } 测试结果我就不显示了。还有什么不足敬请指教。