实现memcpy和memmove的比较

#include <stdio.h>
#include <string.h>//使用memcpy函数时记得引用它的头文件
//应用模拟实现的memcpy函数
int main()
{
	int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	memcpy(arr1 + 2, arr1, 24);//根据编译器的不同,实现的方式也是不同的;没有具体说明
	memmove(arr2 + 2, arr2, 24);//memmove有具体说明实现的方式
	int i = 0;
	    for (i = 0; i < 10; i++)
		printf("%d ", arr1[i]);
		printf("\n");//实际出现结果
		for (i = 0; i < 10; i++)
		printf("%d ", arr2[i]);//实际出现结果
	
	return 0;
}

调试的结果为:

虽然结果相同,但是memcpy是没有规定的编译标准的;可能在vs上和memmove一样

但在别的编译器上就会出现别的情况,如下是对memcpy在别的编译器上的模拟实现:

#include<stdio.h>
#include<assert.h>
//模拟实现memcpy
void* my_memcpy(void* dest, const void* scr, size_t count)
{
	assert(dest && scr);//断言传进来的地址不是空指针
	void* ret = dest;//保存目标起始地址
	char*p1=(char*)dest;
	char*p2=(char*)scr;
	while (count--)//拷贝源地址存储的数据
	{
		*p1++ = *p2++;
		/*(char*)dest = (char*)dest + 1;
		(char*)scr = (char*)scr + 1;*/
	}
	return ret;//返回目标起始地址
}
//应用模拟实现的函数
int main()
{
	  //int arr1[] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 };
	int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memcpy(arr2+2, arr2, 24);//拷贝6个字节的数据
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果是:

可以看出memcpy没有固定的标准!

而memmove在所有编译器上都是相同!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值