模拟实现memcpy和memmove函数
来源:互联网 发布:吉首大学教务网络系统 编辑:程序博客网 时间:2024/05/21 12:50
模拟实现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则不能。
- 模拟实现memcpy和memmove函数
- 模拟实现memcpy和memmove函数
- 模拟实现memcpy memmove 函数
- 模拟实现 memcpy memmove 函数
- memcpy函数和memmove函数的模拟实现与区别
- day26之模拟实现memcpy和memmove函数
- 实现memcpy和memmove函数
- 实现memcpy( )和memmove( )函数
- 实现memcpy和memmove函数
- C语言模拟实现memcpy,memmove函数
- 【c语言】模拟实现memcpy()、memmove()函数
- 模拟实现memset,memcpy,memmove函数
- 模拟实现内存操作函数memcpy、memmove
- memcpy和memmove的模拟实现
- memcpy和memmove的模拟实现
- C语言模拟实现memcpy和memmove
- memcpy和memmove函数的实现
- memcpy和memmove函数的实现
- 在嵌入式linux串口终端中,如何烧录内核和上传文件?
- json字符串转JSONObject及JSONArray
- Centos的阿里源-yellowcong
- Java线程池原理与使用实例
- 深圳H5精英班户外活动
- 模拟实现memcpy和memmove函数
- 编写一个通信录
- Spring4.0 的validation验证
- c语言---位域
- 前台JSON对象和JSON字符串互转
- 二叉树的建立与遍历详解 菜鸟都能看懂的教程
- aliyun的centOS的yum源地址
- 应届毕业生如何通过学习Linux系统选择一份高薪职业
- days3