memmove和memcpy库函数的实现

本文详细介绍了C语言中的内存复制函数memcpy和memmove,包括它们的描述、工作原理以及手动实现。memcpy适用于不重叠的内存区域复制,而memmove在处理可能重叠的内存区域时能确保数据安全。通过示例代码,读者可以理解这两个函数的具体用法和区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一、memcpy函数

1、描述

2.实现

 二、memmove函数

1、描述

 2、实现


 

一、memcpy函数

1、描述

C 库函数 void *memcpy(void *dest, const void *src, size_t count) 从存储区 src 复制 count 个字节到存储区 dest

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmFuYmFuYmFubmk=,size_20,color_FFFFFF,t_70,g_se,x_16

注:返回值:.src和dest所指内存区域不能重叠,函数返回指向dest的指针。 

2.实现

void* my_memcpy(void* dest, const void* src, size_t count)
//count的单位实际上是字节
{
	assert(dest && src);
	void* ret = dest;//因为返回值为void指针
	while (count--)
	{
		*(char*)dest = *(char*)src;
		//char类型的指针为一个字节,因此我们不管拷贝对象是什么类型我们只需要给他转换成多少字节就可以
		//也就是我们需要的size_t count
		dest = (char*)dest + 1;//强制类型转换
		src = (char*)src + 1;
	}
	return ret;
}

 二、memmove函数

1、描述

C 库函数 void *memmove(void *dest, const src *str2, size_t count) 从 src 复制 count 个字符到 dest,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmFuYmFuYmFubmk=,size_20,color_FFFFFF,t_70,g_se,x_16

 2、实现

关于memmove函数的实现我们得分情况讨论,因为我们是把数据从一个缓冲区转移到另外一个缓冲区,因此我们得分情况讨论,因为数组的地址是从低到高,因此我们可以利用指针地址的大小来分情况讨论,也就是dest > src和src > dest的时候,当src > dest 因为我们的数据不会重叠因此我们只需要和memcpy一样实现从前往后拷贝就好了,但是当dest > src的时候就不一样了,因为我们的数据会重叠,因为我们需要从后往前来实现拷贝。

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//从前往后
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;//强制类型转换
			src = (char*)src + 1;
		}
	}
	else
	{
      //从后向前
		while (count--)
		{
			*((char*)dest +count)= *((char*)src + count);
		}
	}
	return ret;
}

 

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跑不死的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值