memcpy使用+模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:41:33 2022/02/26
【摘要】 内存函数 memcpy()-内存拷贝函数count:要拷贝的字节数函数memcpy从src位置开始向后赋值count个字节的数据到dest的内存位置,遇到 ‘\0’ 的时候不停下来如果source和destination有任何的重叠,复制的结果都是未定义的int main(){ int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[20] = { ...

内存函数

memcpy()-内存拷贝函数

image-20220209220933555

count:要拷贝的字节数

  • 函数memcpy从src位置开始向后赋值count个字节的数据到dest的内存位置,
  • 遇到 ‘\0’ 的时候不停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, sizeof(int) * 10);
	int i = 0;
	for (i = 0;i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

模拟实现memcpy()

1.只知道要拷贝的字节数,不知道要拷贝的元素是什么类型。所以可以强转为char*指针->1个字节1个字节的拷贝


2.返回目标空间的起始地址,注意返回类型是void*,是指针,所以可以返回 若返回类型是void,则不可以返回,


3.目标空间不修改,所以可以使用const修饰


4.要拷贝的字节数不可能为负数,所以接收类型可以为无符号整数

void* my_memcpy(void* dest,const void* src,size_t count )
{
	assert(dest&&src);
	void* ret = dest;	//为了返回目标空间起始地址
	//共拷贝n个字节
	while(count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;//这样写是防止编译器报错
		src = (char*)src + 1;
	}
	//若写成 dest = (char*)dest++; //有些编译器可能跑不过去
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, sizeof(int) * 10);
	int i = 0;
	for (i = 0;i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

注意:我们这种模拟实现的方法,不能处理重叠的内存拷贝,

如:想要将数组的1234拷贝到3456中,

void* my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;	//为了返回目标空间起始地址
	//共拷贝n个字节
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;//这样写是防止编译器报错
		src = (char*)src + 1;
	}
	//若写成 dest = (char*)dest++; //有些编译器可能跑不过去
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(arr+2, arr, 16);
	int i = 0;
	for (i = 0;i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

想要的效果:1212347890

使用my_memcpy得到的结果:1 2 1 2 1 2 7 8 9 10

原因:

image-20220209221313117

但是使用库函数memcpy函数,可以实现拷贝

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memcpy(arr+2, arr, 16);
	int i = 0;
	for (i = 0;i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

打印结果:1 2 1 2 3 4 7 8 9 10


但是C语言只要求memcpy函数可以实现不重叠的内存拷贝即可,要实现重叠内存拷贝的话,实现memmove函数


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。