直接上源代码
对于memcpy和memmove来说其用法几乎一致所以在模拟实现时我分成了两份
第一份
对于memcpy来说在有一些编译器下并不会考虑重叠的情况即一下是不考虑重叠时候的代码:
void* my_memcpy(void* des, const void* sor, size_t num) { assert(des && sor); void* ret = des;//该函数返回des的地址 while(num--) { *((char*)des) = *((char*)sor); ++(char*)des; ++(char *)sor; } return ret; }
第二份
而有时候(vs环境IDE)的memcpy又会考虑重叠的情况所以此时的代码和memmove相同
void* my_memmove(void* des, const void* sor, size_t num) { assert(des && sor); void* ret = des;//该函数返回des的地址 if (des < sor)//从前往后将sor的前面开始放进des的前面 { while (num--) { *((char*)des) = *((char*)sor); ++(char*)des; ++(char*)sor; } } else//des > sor 将sor从后往前放进des的后面 { while (num--)//并且此处刚好num-- 指向正确的位置,否则还需要num-1 { *((char*)des + num) = *((char*)sor + num); } } return ret; } int main() { char arr[] = "cdefgq"; char arr1[] = "ab"; //printf("%s\n",(char *)memmove(arr+3, arr+2,2));//第三个参数是以byte为单位的,但是不将\0拷贝进去、 printf("%s", (char*)my_memmove(arr+3, arr+2, 2)); return 0; }
最后,对于memcpy的是否考虑重叠问题是不确定的所以在使用memcpy时有几个建议
- 在没有重叠问题时用memcpy,在有重叠时用memmove
- 或者直接摒弃memcpy,来只使用memmove