区别
memcpy()和memmove()都是c语言的库函数,在头文件string.h
中,作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是不确定的。
memcpy:
原型:
作用是将src里面count个字节拷贝到dest中。
//memcpy内存拷贝(仅仅实现不相关的内存拷贝)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memcpy(void *dest, const void *src, size_t count)
{
char *ret= (char *)dest;
//拷贝count次
while (count--)
{
*(char*)dest = *(char*)src;
//字符型指针+1即跳过一个字符型(一个字节)
dest = (char *)dest + 1;
src = (char *)src + 1;
}
return ret;
}
int main()
{
int a[10];
int b[6] = {1,2,3};
int i = 0;
my_memcpy(a, b, 12);
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
由于数组a没有初始化,所有拷贝12个字节之后应为1,2,3,七个随机值。
运行:
memmove:
原型:
作用是将src里面count个字节拷贝到dest中。但是可以重复拷贝。
重复拷贝注意事项:
- 若dest > src
- 若dest < src
- 若不为重复拷贝
从前向后拷贝或者从后向前拷贝不影响。
//任意内存的拷贝
#include<stdio.h>
#include<stdlib.h>
void *my_memmove(void * dest, const void *src, size_t count)
{
char *ret = (char *)dest;
if (src < dest)
{
////从后往前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
else
{
//从前往后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
int main()
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i;
my_memmove(a + 3, a + 2, 16);
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
由以上分析可得结果应为:1,2,3,3,4,5,6,8,9,10
运行: