-
memcpy
1.1 使用方法
memcpy 是从内存中复制一块区域。使用时传入目的地址,原地址,要复制的字节数。
memcpy在复制字符串时不检查是否包含‘\0’,只精确的复制n个字节。
函数的具体介绍可以从cplusplus.com上看到:
char arr[] = "abcdef";
char arr1[30];
如果想把arr里的内容复制到arr1里就可以使用memcpy,因为memcpy是复制内存上的数据所以它可以复制任意类型的数据。
例如:
int main()
{
char arr[] = "abcdef";
char arr1[30];
memcpy(arr1, arr, strlen(arr) + 1);//把'\0'也复制过去
printf("%s\n", arr);
printf("%s\n", arr1);
return 0;
}
结果为:
1.2模拟实现
memcpy可以复制任意类型的数据并返回目的地址,返回值是void*类型,其次参数分别为目的地址,原地址,无符号整型。
void* my_memcpy(void *arr1, void *arr, size_t num)
因为void*类型不能直接解引用或运算,所以把void*强转为char*,并一个字节一个字节的复制以适用于任何类型。
参考代码:
void* my_memcpy(void *dst, void *src, size_t num)
{
void* tmp = dst;
while (num--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return tmp;
}
但是memcpy如果复制的原地址与目的地址有重度的空间就会出现问题
例如:
把src里的内容从前往后复制到dst中就会出现问题,没来得及复制的内容会被覆盖。
因此复制空间有重复的就要使用memmove。
2. memmove
2.1使用方法
memmove使用方法和memcpy一样
memmove复制的原地址与目的地址有重度的空间时会使用不同的复制方式。
2.2模拟实现
我们可以分情况讨论
目的地址高于原地址和没有重复空间时,从后向前复制。
原地址高于目的地址时,从前向后复制。
参考代码:
void* my_memmove(void *dst, void *src, size_t num)
{
char* tmp = dst;
if (dst < src)
{
while (num--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dst+num) = *((char*)src+num);
}
}
}