memcpy和memmove都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
**void *memcpy(void dst, const void src, size_t count);
**void *memmove(void dst, const void src, size_t count);
两者之间相同的作用是将src处的内存的内容拷贝count个字节给dest处,区别在于memmove保证结果的正确性,而memcpy只为完成工作即可。
- memcpy的模拟实现十分的简单,只需要确定首位置和要复制的位置,然后通过char*指针进行一个个的复制,把src的内容复制给dest即可!代码如下:
//实现memcpy函数的模拟
//#include<assert.h>
//void* my_memcpy(void* dest, const void* src, size_t count)
//{
// assert(src && dest);
// void* ret = dest;
// while (count--)
// {
// *(char*)dest = *(char*)src;
// dest = (char*)dest + 1;
// src = (char*)src + 1;
// }
// return ret;
//}
//
//
//
//
//
//int main()
//{
// int arr1[10] = { 1,2,3,4,5,6,7,8,9.10 };//源头空间
// int arr2[5] = { 0 };//目标空间
// my_memcpy(arr2,arr1,20);//内存操作函数!!! 5个字母一个占4个字节
// //memcpy(arr2, arr1, 20);
// for (int i = 0; i < 5; i++)
// {
// printf("%d ",arr2[i]);
// }
// return 0;
//}插入代码片
memmove的函数
在拷贝内存内容的时候,会遇到下面两种情况:
- dest<src的情况,此时如果先把3—>5这样的话会覆盖5这个位置,所以采用从前到后拷贝的方法
- dest>src的情况如果仍采用从前到后的拷贝,从3—>5的拷贝会使得5的位置的数据被覆盖,这样我们采取的不能是这个方法
应该从后向前拷贝,先把7拷贝到10的位置,然后继续拷贝。
代码实现如下:
//void* my_memmove(void* dest, const void* src, size_t count) {
// assert(src && dest);
// void* ret = dest;
// if (dest < src)
// {
// while (count--) {
// *(char*)dest = *(char*)src;
// dest = (char*)dest + 1;
// src = (char*)src + 1;
// }
// }
// else
// {
// while (count--) {
// *((char*)dest + count) = *((char*)src + count);
// }
// }
// return ret;
//}代码片