您的位置:首页 > 其它

模拟实现memcpy和memmove函数

2017-08-10 14:39 691 查看
模拟实现memcpy

思路:

memcpy函数可以实现拷贝功能,但是不能处理有目的和源有内存重叠的情况,后面会举例看到。另外还要考虑特殊情况,指针判空,还有所要使用的变量是否合法,都要进行判断。

代码:

//模拟实现memcpy

void *my_memcpy(void*dest, void*src,int i) //i是所要拷贝的字节数

{

int* d = (int*)dest;
int* s = (int*)src;
if (d== NULL || s == NULL || i< 0)// 不合理情况的处理
{
printf("ERROR");
return;
}
while (i--)
{
*d++ = *s++;
}

}

int main()

{
int i = 0;
int ret = 0;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int s[] = { 11, 22, 33, 44, 55 };
scanf_s("%d",&ret);
int length = sizeof(a) / sizeof(a[0]);
my_memcpy(a, s, ret );
for (i = 0; i < length; i++)
{
printf("%d",a[i]);
}
system("pause");
return 0;

}

运行结果:



刚刚说,memcpy函数不能处理有内存重叠的情况,我们来测试一下



上面,我们想把1234拷到4567的位置,预想结果是1234123489,然而我们测试结果确是123123189,这是怎么回事呢?看图说明



综上,memcpy不能处理内存有覆盖的情况,所以我们在处理内存有覆盖的时候,就需要用memmove函数。

模拟实现memmove

思路:

memove函数可以实现拷贝功能,可以处理有目的和源有内存重叠的情况。在上面拷贝的时候因为从前往后拷贝的时候,造成了数据被覆盖出现了错误,那么是否可以从后往前拷呢?

代码:

void* my_memmove(int*dest, int*src, int i, int length)//length是长度,i是拷贝的字节数

{

int* d = (int*)dest;
int* s = (int*)src;
if (d == NULL || s == NULL || i < 0 )
{
printf("ERROR");
return 0;
}
if (d> s)
{
while (i--)
{
*(d+i) = *(s+i);
}
}
else
while (i--)
{
*d++ = *s++;
}
return d;

}

int main()

{
int ret = 0;
int i = 0;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int length = sizeof(a) / sizeof(a[0]);
scanf_s("%d", &ret);
my_memmove(a + 3, a, ret);
for (i = 0; i < length; i++)
{
printf("%d", a[i]);
}
system("pause");
return 0;

}

运行结果:



结果分析:



所以说,memmove函数和memcpy函数主要区别就是,memmove函数能够处理内存有重叠的情况,而memcpy则不能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: