memcpy函数
memcpy函数的作用是将一段空间内的内容复制到另一段空间内。
函数原型:void *memcpy(void *p1, void *p2, unsigned size);
返回值是新空间的地址,第一个参数是指向用于存储复制内容的目标数组,第二个参数指向要复制的数据源,第三个参数是要复制的字节数。
strcpy只能复制字符串,memcpy可以复制任意类型数据。
使用方法和strcpy函数差不多。使用起来并不难
我们可以来看看这个函数的实现
#include <stdio.h>
void* My_memcpy(void* p1, const void* p2, size_t n)
{
void* tem = p1;
while (n--)
{
*(char*)p1 = *(char*)p2;
p1 = (char*)p1 + 1;
p2 = (char*)p2 + 1;
}
return tem;
}
int main()
{
char arr[20] = { 0 };
char arr1[] = "hello world";
My_memcpy(arr, arr1, sizeof(arr1));
printf("%s\n", arr);
printf("%s\n", (char*)My_memcpy(arr, arr1, sizeof(arr1)));
return 0;
}
实现起来并不难,和之前qsort函数的实现有点相同。主要是在设计时要将参数的类型进行强制类型转换。思想和qsort函数设计的一样,不懂可以看看之前的qsotr函数的文章
memcpy函数在当起始空间和目的地空间重叠时并不能保证复制过程不被干扰。
可以使用memmove函数来代替使用。这个函数能保证在空间重叠时,复制过程不会被干扰。
void *memmove( void* dest, const void* src, size_t count );
使用方法和memcpy一样。可以看看memmove的实现方法
#include <stdio.h>
void* My_memmove(const void* p1, const void* p2, size_t num)
{
void* s1 = p1;
void* s2 = p2;
if (p1>p2)
{
while (num--)
{
p1 = (char*)s1 + num;
p2 = (char*)s2 + num;
*((char*)p1) = *((char*)p2);
}
}
else
{
while (num--)
{
*((char*)p1) = *((char*)p2);
p1 = (char*)p1 + 1;
p2 = (char*)p2 + 1;
}
}
return s1;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
char arr[] = "abcdefghijk";
My_memmove(arr1 + 3, arr1, 20);
My_memmove(arr + 3, arr, 5);
printf("%s\n", arr);
for (int i = 0; i < 15; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
主要是将复制方法分成两个部分。
比较两个地址的大小,当起始空间大于目的空间时,我们采取从后向前复制,防止再复制时其实空间后面的内容被覆盖,从而改变复制结果。当小于时,则采取从前向后复制。