模拟实现memcpy

模拟实现memcpy


函数原型
void *memcpy( void *dest, const void *src, size_t count );

头文件
<string.h>

功能
memcpy函数从src(源内存地址起始位置)拷贝count个字节到des(目的地内存地址的起始位置)

使用须知
memcpy函数处理内存非重叠区,即 不处理des地址为自身内存范围的函数操作。
memmove函数除包含memcpy的函数功能,还可以处理内存重叠区拷贝操作哦

函数实现思路
首先,将主函数部分大体框架完成。

接下来完成My_memcpy内容。我们将完成拷贝操作,所以我们实现的函数参数部分肯定要有des(目的地内存地址的起始位置),src(源内存地址起始位置),和拷贝多少字节的count。

我们要注意,与只处理字符串的strcpy函数相比,memcpy要处理各种类型数据,所以使用可以接受任意指针的void*。返回类型当然也为void*

内容
函数参数有指针,断言不可少。void指针无法进行指针运算,进行拷贝内存操作时,强制类型转换的(char*)不能少(char* ± 1操作往后走一个字节).。最后进行拷贝数据操作。


实现memcpy代码

#include<stdio.h>
#include<assert.h>
typedef struct PerData
{
	char name[20];
	int age;
}PerData;//typedef简化结构体命名

void* My_memcpy(void* des, const void* src, size_t count)
{
	assert(des && src);//断言,对括号里面的假设的条件进行判断
					   //括号中的内容为真,程序正常执行
					   //括号里面的内容为假,屏幕打印出错误源
	void* ret = des;
	while (count--)
	{
		*(char*)des = *(char*)src;
		++(char*)des;//这边要记得前置++,由于空类型指针
		++(char*)src;
		//1.无法进行指针运算,即不能+-整数操作
		//2.空类型指针可以接受任意指针
		//3.不能进行解引用操作
	}
	return ret;
}
int main()
{
	int i = 0;
	PerData A[] = { { "zhangsan",18 },{"lisi",20} };
	PerData B[2] = { 0 };
	My_memcpy(B, A, sizeof(A));
	for (i = 0; i < 2; i++)
		printf("%s\t%d\n", B[i].name, B[i].age);
	return 0;
}

若对你有帮助,别忘了分享收藏 哦!Good Day!!!

上一篇:c语言数组复制


下一篇:Unity 使用Photon Server 联网开发(二)