实现memmove()
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝size个字节到目标dst所指的内存地址的起始位置中。memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
当出现下面图中的情况时 , memcpy并不能满足要求
但我在windows下的几种编译器中和linux环境下 , memcpy()和memmove()运行结果都是一样的 , 这是因为编译器对memcpy()做了优化 ,但对于我们自己写的memcpy()函数 ,则不会优化
代码实现memmove():
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void* Memmove(void* Dst, const void* Src, int size) {
for (int i = size; i >= 0; --i) {
*((char*)Dst + i) = *((char*)Src + i);
}
return Dst;
}
void* Memcpy(void* Dst, const void* Src, int size) {
for (int i = 0; i < size; ++i) {
*((char*)Dst + i) = *((char*)Src + i);
}
return Dst;
}
int main() {
char str1[30] = "abcdefghij";
char str2[30] = "abcdefghij";
char* s1 = str1 + 4;
char* s2 = str2 + 4;
Memmove(s1, str1, 11);
Memcpy(s2, str2, 11);
printf("%s\n", s1);
printf("%s\n", str1);
printf("%s\n", s2);
printf("%s\n", str2);
system("pause");
return 0;
}
我们可以看到memcpy()不能成功地完成要求,而memmove()可以