函数原型
void* memmove(void* dest, const void* src, size_t count);
头文件
#include
返回值
返回dest的指针(注意是void* 类型)
功能
1. 由src所指向的内存区域复制count个字节到dest所指向内存区域
2. memmove与memcpy的区别在于需要考虑目标区域和源区域是否有重叠的情况。当目标字符串与源字符串没有重叠,与memcpy函数功能相同
3. memmove能够保证源字符串在被覆盖之前将重叠区域的字节拷贝到目标区域之中,但复制后源字符串重叠区域的内容会被更改。
实现
这个函数经常会在各个大厂的面试中出现,要求面试者自己实现该功能,以下提供一个实现方法,如有错误敬请指正。
#include #include void* my_memmove(char* dest, const char* src, size_t count){ //思路:分3种情况 //1:当源区域内存的首地址与目标区域内存的首地址相等时,不进行任何拷贝 //2:当源区域内存的首地址大于目标区域内存的首地址,进行正向拷贝 //3. 当源区域内存的首地址小于目标区域内存的首地址,进行反向拷贝 char* d = (char*)dest; const char* s = (const char*)src; if (s > d) { //从s的起始地址开始向后循环 while (count--) *d++ = *s++; } else { //从s+count-1的地址开始向前循环 s = s + count - 1; d = d + count - 1; while (count--) *d-- = *s--; } return dest;}int main(){ char s[] = "Golden Global View"; my_memmove(s, s+7, strlen(s)+1-7); printf("%s", s); return 0;}
运行结果