天天看点

模拟实现memcpy和memmove函数

模拟实现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和memmove函数

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

模拟实现memcpy和memmove函数

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

模拟实现memcpy和memmove函数

综上,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;

}

运行结果:

模拟实现memcpy和memmove函数

结果分析:

模拟实现memcpy和memmove函数

所以说,memmove函数和memcpy函数主要区别就是,memmove函数能够处理内存有重叠的情况,而memcpy则不能。

继续阅读