本节重点内容:
- 深入理解 memmove 函数的使用
- 深入理解 memmove 函数的使用
⚡memmove
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memmove函数的基本使用:
#define _CRT_SECURE_NO_WARNINGS
#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);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行结果如下:
⚡模拟实现memmove函数
在我们模拟之前我们不妨想想这个问题,在重叠部分进行拷贝时,应该考虑dest指向的字符串与src指向的字符串的位置关系来确定如何使得拷贝src字符在未被拷贝之前不被修改,因此我们需要进行讨论:
经过分析,我们可以得出情况一将采用(后->前),情况二和三采用(前->后)来进行拷贝是合理的,因此代码示例如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>
void my_memmove(void* dest, const void* src, size_t num)
{
char* start = dest;
assert(dest && src);
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return start;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行结果如下:
在这里需要注意的是:在C语言中,memcpy 用来拷贝不重叠的部分,重叠的部分交给 memove来做,如果 memove可以完成100%,那么memcpy可以完成60%。但在VS中比较特殊的是,memcpy可以进行重叠部分的拷贝,memove和memcpy都可以完成100%。
感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。