C语言模拟实现 memcpy和memmove库函数(原理简单分析)

模拟实现memcpy库函数

 #include<stdio.h>
void* my_memcpy(void*copy, void*test, unsigned int num)  //memcpy可以复制任意类型数(整形,字符串等)
{
int* p2 = (int*)copy;   //强制转换  其中arr元素地址类型本就为 int*
int* p1 = (int*)test;
while (num != 0)
{
	*p2++ = *p1++;//解引用赋值后地址再++;  //若地址重叠 低位寻址可能会导致重叠问题导致原有区域被覆盖
	num--;
}
return p1;//返回p1地址   上面已经通过寻址改变了arr的元素 ,这里p1地址就是arr首元素地址
 }
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
my_memcpy(arr + 2, arr, 6);
for (i = 0; i < sz; i++)
{
	printf("%d ", arr[i]);//1 2 1 2 1 2
}
return p2;
}
memcpy实现过程
p1对p1开始赋值前p1数组元素情况

p2对p1开始复制前数组元素情况

p1对p2开始赋值

这里 p2地址比p1高两位
低位开始寻址 再赋值给p2时 由于数组地址有重叠部分,低位赋值这造成p2较高位地址被覆盖
p2对p1开始复制

赋值后p2结果

赋值后结果

模拟实现memmove库函数

#include<stdio.h>
void* my_memmove(void*copy, void*test, unsigned int num) 
{
int* p2 = (int*)copy;
int* p1 = (int*)test;

while (num != 0)
{
	*(p2 + num - 1) = *(p1 + num - 1);//从高位进行寻址能有效避免从低位寻址所带来的重叠问题
	num--;
}
return p2;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8, };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
my_memmove(arr + 2, arr, 6);
for (i = 0; i < sz; i++)
{
	printf("%d ", arr[i]);
}
return 0;
}
memmove实现过程
p1对p2开始赋值

可以看见从高位寻址赋值不会覆盖低位,保证赋值的准确性
p1对p2高位寻址赋值

赋值后p2结果

赋值后结果
C语言初学者,如有不对,请多多指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值