目录
在模拟实现memcpy和memmove内存函数之前首先要了解一下这两个函数。
一、memcpy函数
1、memcpy的作用
memcpy函数是将n个字节的源指向的地址拷贝到目的地地址。所需要的参数是目的地地址的指针,源地址的指针和要拷贝的字节大小,需要引用的头文件是string.h。
2、memcpy的使用
比如将一个int型的数组arr1[10]其中有10个数据中的前5个数据拷贝到arr2中。
#include <string.h>
void test()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
int arr2[10] = { 0 };
//内存拷贝函数
memcpy(arr2, arr1, 20);
}
int main()
{
test();
return 0;
}
二、memmove函数
1、memmove的作用
memmove函数也是将n个字节的源指向的地址拷贝到目的地地址,区别是允许目标和源重叠。所需要的参数是目的地地址的指针,源地址的指针和要拷贝的字节大小,需要引用的头文件是string.h。
2、memmove的使用
#include <string.h>
void test()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
memmove(arr1+2, arr1, 20);
}
int main()
{
test();
return 0;
}
三、模拟实现memcpy
首先通过了解memcpy函数的参数目的地地址的类型是void* ,源地址也是const void* ,字节大小是size_t,所以在模拟实现时也要用相同的类型,目的地地址使用void*是因为不知道使用者要拷贝的是什么类型所以用void*来接收。源地址使用const void*是为了不能改变源地址的数据。该函数返回的是目的地地址所以一开始要用一个ret临时变量来保存最开始的dest的地址。函数的原理是一个字节一个字节的拷贝,因为是void*的类型需要强制类型转换成char*,就可以一个字节一个字节的拷贝,当n个字节减少到0是拷贝结束。具体代码如下。
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)//num单位是字节
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
void test3()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
int arr2[10] = { 0 };
//内存拷贝函数
my_memcpy(arr2, arr1, 20);
}
int main()
{
test3();
return 0;
}
四、模拟实现memmove
在了解memcpy函数之后又一个问题当需要对自己这个数组重复拷贝是就会出现问题,如下图
我们需要将arr1数组中的前5个数字1,2,3,4,5拷贝到arr1+2的地址上去,这样用memcpy来拷贝就会重复拷贝,我们要得到的结果是121234589,但是实际输出的是121212189。这样就需要memmove函数来解决。
在模拟实现memmove函数是需要考虑两种情况。
首先第一种当源地址比目的地地址低时需要从后向前拷贝,这样才不会遗漏数据。
第二种是当目的地地址比源地址低时需要从前向后拷贝。
具体代码如下。
#include <stdio.h>
#include <assert.h>
#include <string.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
//从前向后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//从后向前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
}
void test4()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//memmove(arr1 + 2, arr1, 20);
my_memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
}
int main()
{
test4();
return 0;
}
以上就是本篇的全部内容,如有错误请批评指正。