内存函数memcpy和memmove详解

发布于:2022-12-20 ⋅ 阅读:(601) ⋅ 点赞:(0)

目录

一、内存函数介绍

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,实现代码合理化

本文含有隐藏内容,请 开通VIP 后查看