内存函数memcpy和memmove详解

本文详细解读了C语言中memcpy和memmove内存函数的工作原理、参数与返回值,并通过实例演示了它们在实际编程中的应用。同时,还介绍了如何模拟实现这两种函数以应对不同数据类型的复制需求,以及它们在内存重叠情况下的区别。
摘要由CSDN通过智能技术生成

目录

一、内存函数介绍

1.memcpy函数介绍

   1.声明

   2.功能function

   3.  Parameters参数

   4.Return Value返回值             

2.memmove函数介绍

 1.声明

 2.function功能

 3.  Parameters参数

 4.Return Value返回值 

二、库函数memcpy和memmove 的使用实例

1.memcpy实例

1.代码

2.调试运行,观察arr2

2.memmove实例

1.代码

2.调试运行,观察arr1

三、模拟实现memcpy和memmove函数

1.memcpy模拟实现

1.了解内存布局原理

2.代码实现memcpy

2.memmove的模拟实现

1.内存布局分析

2.代码实现

总结

memcpy函数memmove函数基本原理相同,都是通过字节操作实现拷贝,基本代码一致

不同在于, memcpy满足无内存重叠部分的copy即可    

  memmove则专门实现内存重叠部分的copy


前言

内存函数是一种,对任何数据类型都能进行操作的函数,对其进行解析和学习,能让我们对内存函数和c语言有更加深刻的理解。

一、内存函数介绍

1.memcpy函数介绍

   1.声明

   2.功能function

 

 3.  Parameters参数

      4.Return Value返回值             

 destination is returned.

 返回 void*destination

2.memmove函数介绍

1.声明

 2.function功能

  3.  Parameters参数

4.Return Value返回值 

destination is returned.

 返回 void*destination

二、库函数memcpy和memmove 的使用实例

 

1.memcpy实例

1.代码

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 40);
	return 0;
}

2.调试运行,观察arr2

执行memcpy前arr2内部全部初始化为0

 

 执行memcpy后arr2内部已经被全部copy为arr1中的数据 

2.memmove实例

1.代码

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1, arr1+3, 16);
	return 0;
}

 将1234替换为4567

2.调试运行,观察arr1

运行memmove前

 

运行memmove后

1234被替换为4567

三、模拟实现memcpy和memmove函数

1.memcpy模拟实现

明确void*类型传参,面对不同的数据类型 ,不同的步长,如何用一个“万能”代码,实现对任意数据类型都可以实现拷贝,是解决的关键

1.了解内存布局原理

 

2.代码实现memcpy

下面给出一种实现这一功能的代码

void*my_memcpy(void* dest, const void* str, size_t num)
{
	assert(dest);//防止*操作空指针
	assert(str);
	void* ret = dest;//存储det的地址,用于返回初det的值
	while (num--)//当num字节数减为0时停止
	{
		*(char*)dest = *(char*)str;//将指针强制转化为char*,步长为字节,通过对字节操作,实现
		((char*)dest)++;//分别使地址向下移动一位
		((char*)str)++;//分别使地址向下移动一位
	}
	return ret;//返回det初始值
}

2.memmove的模拟实现

memmove主要实现内存重叠的copy,如何解决内存重叠部分使用memcpy会出现的覆盖现象,为   实现memmove的关键。

1.内存布局分析

2.代码实现

在上面memcpy基础上加上条件语句进行分支即可

 

void* my_memmove(void* det, void* src, size_t num)
{
	void* ret = dest;
	assert(det);
	assert(src);

	if (det < src)//det<src 前->后
	{
		while(num--)
		{
			*(char*)det = *(char*)src;
			dest = (char*)det + 1;
			src = (char*)src + 1;
		}
	}
	else //det>=src 后->前
	{
		while (num--)
		{
			*((char*)det + num) = *((char*)src + num);
		}
	}
	return ret;
}


四、总结

memcpy函数memmove函数基本原理相同,都是通过字节操作实现拷贝,基本代码一致

不同在于, memcpy满足无内存重叠部分的copy即可

       memmove则专门实现内存重叠部分的copy

具体写代码时需根据具体条件,合理选择memcpy或memmove,实现代码合理化

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值