1.memmove函数的使用
memmove函数是 C 标准库中的一个内存处理函数,定义在 <string.h>
头文件中。与 memcpy
类似,它用于将一块内存区域的内容复制到另一块内存区域。不同的是,memmove
可以安全地处理源和目标内存区域重叠的情况,而 memcpy
在重叠情况下可能会产生未定义行为。
void * memmove ( void * destination, const void * source, size_t num );
destination
:目标内存区域的起始地址。source
:源内存区域的起始地址。num
:要复制的字节数。- 返回目标内存区域
destination
的起始地址。
实例:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
运行结果:
2.memmove函数的模拟实现
#include <stdio.h>
#include <string.h>
void* my_memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
//如果目标地址在源地址之前,或者它们不重叠,则从前向后复制字节。
if (dst <= src || (char*)dst >= ((char*)src + count)) {
while (count--) {
*(char*)dst = *(char*)src; //将void*类型的dest和src转换为char*类型,以便逐字节操作
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
//如果目标地址在源地址之后,并且它们重叠,则从后向前复制字节,以避免覆盖尚未复制的数据。
else {
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--) {
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return(ret);
}
int main()
{
char str[] = "memmove can be very useful......";
my_memmove(str + 20, str + 15, 11);
puts(str);
return 0;
}