模拟实现memcpy

本文介绍了如何使用C语言模拟实现memcpy函数,该函数用于从源内存地址src拷贝指定数量count的字节到目标内存地址des。文章详细阐述了实现过程,包括使用assert进行断言检查,以及利用(void*)指针进行类型转换和逐字节拷贝操作。通过一个实际的PerData结构体数组例子展示了memcpy函数的使用,并给出了完整的代码实现。
摘要由CSDN通过智能技术生成

模拟实现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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值