【C语言学习】内存操作函数之------->memcpy memmove 详解与手动实现

内存操作函数


C语言中有时需要对内存空间进行操作,下面详解三个常用的内存操作函数
函数 |
-------- | -----
memcpy |
memmove |

一、memcpy

 1.  memcpy函数简介
memcpy——————————
参数( void *destination , const void *source , size_t num)
返回值void *
作用从source的位置开始向后复制num个字节的数据到destination的位置
内存空间可能存储着各种类型的数据,如int,char,double,那么在对内存空间的数据进行操作时,就需要一个“万金油”的参数——void* 类型,void* 类型的变量可以存储不同类型数据的地址;参数size_t的单位为字节,是确认对内存空间操作多少字节的数据
 2.  memcpy函数的手动实现

在这里插入图片描述

通过上图,将数据5 6 7 8 9拷贝至0 1 2 3 4内存空间的后面,以此手动实现memcpy。

int arr1[10] = { 0, 1, 2, 3, 4 };//给定10个内存空间,只存放5个数据,用于拷贝arr2的数据
int arr2[5] =  { 5, 6, 7, 8, 9,};
void *my_memcpy(void *dest , const void* src ,int num)
my_memcpy(&arr1[5],arr2,sizeof(arr2));//函数参数与memcpy一致

由于参数num已经明确给出拷贝字节数的多少,故可以以1字节为单位,循环拷贝num次即可。

void *my_memcpy(void *dest , const void* src ,int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		*((char*)dest + i) = *((char*)src + i);
	}
	return dest;
}

拷贝前后如下图

在这里插入图片描述
在这里插入图片描述

整体代码:

void *my_memcpy(void *dest , const void* src ,int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		*((char*)dest + i) = *((char*)src + i);
	}
	return dest;
}
int main()
{
	int arr1[10] = { 0, 1, 2, 3, 4 };
	int arr2[5] =  { 5, 6, 7, 8, 9,};
	my_memcpy(&arr1[5],arr2,sizeof(arr2));
	return 0;
}

mymcpy有一定缺陷,如果source和destination有任何的重叠,拷贝的结果都是未知的。但下文memmove函数很好地弥补了这点缺陷

二、memmove

1.  memmove函数简介
memove——————————
参数(void* destination , const void* source , size_t num)
返回值void *
作用处理源空间与目标空间出现重叠而无法拷贝的情况

拷贝数据时可能会出现下图情况
在这里插入图片描述

将0 1 2 3拷贝至2 3 4 5中,由于有重叠内存空间2 3的存在,故涉及到是从0开始拷贝到3结束(从前向后拷贝),还是从3开始拷贝到0结束(从后向前拷贝),达到我们的目的即:0 1 0 1 2 3 6 7 8 9

memmove拷贝顺序——————————
源空间在目标空间之前从源空间最后一个数据向前拷贝
源空间在目标空间之后从源空间第一个数据向后拷贝
2.memmove函数的手动实现

大体代码与memcpy函数一致,主要解决的是空间重叠问题,故不做过多解释,直接源代码:

void* my_memmove(void *dest, const void*src, int num)
{
	int i = 0;
	if (src > dest)
	{
		for (i = 0; i < num; i++)
		{
			*((char *)dest + i) = *((char*)src + i);
		}
	}
	else
	{
		for (i = num - 1; i>=0; i--)
		{
			*((char*)dest + i) = *((char*)src + i);
		}
	}
	return dest;
}
int main()
{
	int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	my_memmove(&arr[2], arr, 4 * sizeof(int));
	return 0;
}

memmove处理前后数据变化如下图:
在这里插入图片描述
在这里插入图片描述

以上即为两个常用的内存操作函数详解。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值